kuroの覚え書き

96の個人的覚え書き

RX200S6のオンボードSATA software RAIDを使わないでCentOS7をインストール

諸般の事情でRX200S6のRAIDカードを他に回したところ、enbedded MegaRAIDがCentOS7ではドライバがなくて使えないということになり、まあ引退して部品取りでもいいかと思っていたのだけれど、せっかくあるハードウェアを眠らせておくのももったいないということで、活用の方法を考える。

結論としてはオンボードソフトウェアRAIDは殺してしまって普通のAHCISATAとして使うことが可能であった。
F2でbios設定に入り、AdvancedからAdvanced system configurationに進み、RAID enable をdisabledに、SATA AHCI enableをenabledに設定してやる。
HDDは前もってRAIDで使っていた状態から適当な機械でExFATなどに初期化しておく必要がある。

これだけ設定すれば普通にSATAディスクとして認識してインストールも普通にできるようになる。
NASとして使うならFreeNASなど入れてOSの機能でsoftware RAIDを使うと良さげである。

まあRX200S6をNASに使うのは無駄に電気代かかりそうではあるけど、CPUを1個に減らして4コア程度に適当にデチューンしてやれば良いような気もする。ただ、そのままでは2.5インチディスクなので最大容量、容量あたりコストはイマイチではあるので、3.5インチHDDをどうにか外付けするとかの工夫はしたほうがいいかもしれない。しかしそうすると今度は冷却に難が出てくるわけで、なかなか一筋縄には行かないのだな。RX200はMBが巨大なので3.5インチバージョンはそもそも無いしな。


追記
CentOS7のインストール時にターゲットディスクとして複数HDDを指定して、パーティション自動設定を行うと、複数のHDDをsoftware RAID0で束ねてくれるようだ。ストライピングしたくないなら、逆に自分で設定を行う必要がある。もしくはあとからdiskを追加するとか。

SQLiteのINSERTをSQLAlchemyで書く

かなり久しぶりにSQLiteのデータを追加しようと以前に作成したスクリプトを持ち出してきて実行してみたところ

sqlalchemy.exc.ArgumentError: Textual SQL expression 'rnaseq_temp' should be explicitly declared as text('rnaseq_temp')

こんなエラーが出て先に進まない。

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.sql import select, func, insert
engine = create_engine('sqlite:///rnaseq.db', echo=False)


# rnaseq_tempテーブルからrnaseqテーブルにcufflinksのデータをコピーする
conn = engine.connect()
q = select(["""rnaseq_temp.tracking_id,
                    rnaseq_temp.class_code,
                    rnaseq_temp.nearest_ref_id,
                    rnaseq_temp.gene_id,
                    rnaseq_temp.gene_short_name,
                    rnaseq_temp.tss_id,
                    rnaseq_temp.locus,
                    rnaseq_temp.length,
                    rnaseq_temp.coverage,
                    rnaseq_temp.FPKM,
                    rnaseq_temp.FPKM_conf_lo,
                    rnaseq_temp.FPKM_conf_hi,
                    rnaseq_temp.FPKM_status,
                    rnaseq_temp.id,
                    rnaseq_temp.sample_id,
                    rnaseq_temp.xtr_id,
                    rnaseq_temp.gene_id""")],
                    from_obj=['rnaseq_temp'])
 ins = insert(Rnaseq).from_select(
                        (Rnaseq.tracking_id,
                        Rnaseq.class_code,
                        Rnaseq.nearest_ref_id,
                        Rnaseq.gene_id,
                        Rnaseq.gene_short_name,
                        Rnaseq.tss_id,
                        Rnaseq.locus,
                        Rnaseq.length,
                        Rnaseq.coverage,
                        Rnaseq.FPKM,
                        Rnaseq.FPKM_conf_lo,
                        Rnaseq.FPKM_conf_hi,
                        Rnaseq.FPKM_status,
                        Rnaseq.id,
                        Rnaseq.sample_id,
                        Rnaseq.xtr_id,
                        Rnaseq.gene_id2),
                        q)
conn.execute(ins)

こんな感じのスクリプトだったんだけど、どうもSQLAlchemyのテキスト表現の方法に何らかの変更があったらしい。

    from sqlalchemy import text
    conn = engine.connect()
    q = select([text("rnaseq_temp.tracking_id,\
                    rnaseq_temp.class_code,\
                    rnaseq_temp.nearest_ref_id,\
                    rnaseq_temp.gene_id,\
                    rnaseq_temp.gene_short_name,\
                    rnaseq_temp.tss_id,\
                    rnaseq_temp.locus,\
                    rnaseq_temp.length,\
                    rnaseq_temp.coverage,\
                    rnaseq_temp.FPKM,\
                    rnaseq_temp.FPKM_conf_lo,\
                    rnaseq_temp.FPKM_conf_hi,\
                    rnaseq_temp.FPKM_status,\
                    rnaseq_temp.id,\
                    rnaseq_temp.sample_id,\
                    rnaseq_temp.xtr_id,\
                    rnaseq_temp.gene_id")],
                    from_obj=[text('rnaseq_temp')])
     ins = insert(Rnaseq).from_select(
                        (Rnaseq.tracking_id,
                        Rnaseq.class_code,
                        Rnaseq.nearest_ref_id,
                        Rnaseq.gene_id,
                        Rnaseq.gene_short_name,
                        Rnaseq.tss_id,
                        Rnaseq.locus,
                        Rnaseq.length,
                        Rnaseq.coverage,
                        Rnaseq.FPKM,
                        Rnaseq.FPKM_conf_lo,
                        Rnaseq.FPKM_conf_hi,
                        Rnaseq.FPKM_status,
                        Rnaseq.id,
                        Rnaseq.sample_id,
                        Rnaseq.xtr_id,
                        Rnaseq.gene_id2),
                        q)
    conn.execute(ins)

こういうふうに書き換えたらちゃんと走るようになった。

CLUSTALW

これまでCLUSTALWによるクラスタリングから系統樹作成はDDBJのサービスを主に使っていたのだけれど、系統樹を描く部分はNjplotというかなり古いソフトをMac上で利用していた。

これがいつまで使えるかわからないし、クラスタリングからの連携も面倒なので、一気にコマンドでやってしまう環境をローカルに構築する方法を調べた。

一つは

$ brew install clustal-w

とインストールしてしまう方法。
もう一つはBiopythonをpython上で使う方法。
ここはやっぱりpythonでやってしまって、webアプリ化してしまうのが良かろう。

Biopyton からClustalW2を使って系統樹を作成する - Qiita
こちらのサイトを参考に

$ python3
Python 3.7.4 (default, Sep 26 2019, 04:54:54) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from Bio.Align.Applications import ClustalwCommandline
>>> dir = "/clustalw"
>>> input = dir + "/data.fasta"
>>> clustalw_cline = ClustalwCommandline("clustalw2", infile=input)
>>> stdout, stderr = clustalw_cline()
>>> out = dir + "/data.dnd"
>>> from Bio import Phylo
>>> tree = Phylo.read(out, "newick")
>>> Phylo.draw(tree)

ざっとこんな感じ。

最後の行を

>>> Phylo.draw_ascii(tree)

とすると系統樹がasciiアートのテキストデータとして表示される。クレードの長さはちょっと不正確だけれど、コマンドラインだけで完結するのでこれはこれで楽ちんだ。

また

>>> import matplotlib
>>> import matplotlib.pyplot as plt
>>> matplotlib.rc('font', size=6)
>>> Phylo.draw(tree)
>>> tree_fig = dir + "/phylo_tree.png"
>>> plt.savefig(tree_fig)

このようにmatplotlibを使ってイメージを整形保存することも可能。

これらを例によってFlaskアプリに仕立てる。

f:id:k-kuro:20191011190210p:plainf:id:k-kuro:20191011190232p:plainf:id:k-kuro:20191011190241p:plain



どういうわけだかわからないが普通にコンソールからpython3 namage.py runserverで起動したり、flask runで起動したときはちゃんと系統樹がかけるのに、systemdでデーモン起動するとエラーが出て表示できない。pythonをlinuxbrewでインストールしたものがsystemdからうまく利用できていないのか?
とおもってソースからコンパイルしたものを直接インストールしたらライブラリがロードできなくてなんか挙動がおかしいし。

やっぱりclustalwの部分はpythonからshellに出て処理したほうがいいのかもしれない。

解決。
そもそもbiopythonのclustalwはshellのclustalwを呼び出しているだけだった。なので、パスがちゃんと通っていればsystemdからでも動くし、パスが通ってなければインタプリタからでも動かないということらしい。

cDNA FASTAファイルから最長ORFを抽出し、5'UTR/CDS/3'UTRに分割してそれぞれのFASTAファイルを作成する

cDNA FASTAファイルから最長のORFを抽出し、5UTR,CDS,3UTRに分割して保存する。
Multi FASTA にも対応する。

#fasta_utr.py

import sys, os, re
from Bio import SeqIO
from Bio.Alphabet import IUPAC
from Bio.Seq import Seq

fasta_file = sys.argv[1]
faname = os.path.basename(fasta_file)
fdir = os.path.dirname(fasta_file)
fname = os.path.splitext(faname)[0]
fext = os.path.splitext(fasta_file)[1]
utr_5_fasta = os.path.splitext(fasta_file)[0] + '_5utr' + fext
cds_fasta = os.path.splitext(fasta_file)[0] + '_cds' + fext
utr_3_fasta = os.path.splitext(fasta_file)[0] + '_3utr' + fext
for record in SeqIO.parse(fasta_file, 'fasta'):
    match = max(re.findall('(ATG(?:\S{3})*?T(?:AG|AA|GA))', str(record.seq)), key = len)
    if match:
        seq = Seq(match, IUPAC.ambiguous_dna)
        utr_5 = re.sub(str(seq.strip()+'[ACGT]*'), '', str(record.seq))
        utr_3 = re.sub(str(utr_5 + seq.strip()), '', str(record.seq))
        with open(utr_5_fasta, 'a') as f:
            f.write(">" + record.id +'\n')
            f.write(str(utr_5) + '\n')
        with open(cds_fasta, 'a') as f:
            f.write(">" + record.id +'\n')
            f.write(str(seq) + '\n')
        with open(utr_3_fasta, 'a') as f:
            f.write(">" + record.id +'\n')
            f.write(str(utr_3) + '\n')

使い方はかんたん。処理したいFASTAファイルを引数にpythonを実行する。元のファイルと同じディレクトリ階層に_5utr, _cds, _3utrと名前の増えたファイルが生成される。

$ python3 fasta_utr.py <fasta file>

Express5800/R110e-1EにCentOS7をインストールしてファイルサーバにする

ここまで基本FujitsuPrimergyシリーズでサーバを構築してきたのだが、ファイルサーバを別個に立てる必要性が出てきた。
ファイルサーバなのでそんなに強力なCPUもいらないけど、3.5インチHDDが4台くらいは内蔵できてほしい&ラック型1Uで場所を取らない&お金はできるだけかけない、という条件にマッチするものはFujitsuにはなかった。
なのでNECに手を出してしまった。
いつものごとくオークションを徘徊しているとExpress5800/110e-1EのCPU/HDD/memoryを抜き取ったドンガラが100円(送料2000円)で出ていて入札したらそのまま100円で落札できてしまった。
Express5800/110e-1EというとFujitsuでいうとRX100S8くらいの世代だと思う。ivy bridgeくらいのCPUか。
本来のラインナップはPentium G640、XEON E3-1220v2 だな。やはりsandy bridge~ivy bridgeだな。

これに余っていたメモリ4Gを乗っけ、CPUもPentiumG2020を650円で落として装着。
まあ大体3000円位でファイルサーバが出来上がった。これに12TくらいHDDを乗っけてやれば十分だろ。

で、早速CentOS7をインストールしてやろうと思ったのだが、色々Fujitsuとは勝手が違う。
MegaRAIDのソフトウェアRAIDを使うにはMBのジャンパーを差し替えてやらないとbiosに設定が出てこない。
これは本体の蓋の裏に説明があるのでそのとおりにする。

そうするとディスクを認識しておなじみのCtrl-MでRAIDの設定画面に入れるわけだ。
ところがだ、やはりというかCentOS7のインストーラからはドライバがなくてインストールできないときた。

NECのオフィシャルなガイドによるとそもそもCentOSは6.6までしか対応しているという説明はない。まあこれはFujitsuのRX200S7でもそうだったが。
で、CentOS6にしても、
本OSではオンボードディスクアレイ機能 (LSI Embedded MegaRAID) は使用できません。
というツレない表示が!
Oh NO~

Fujitsuで配布されているドライバが使えたりしないだろうか?
ただ、Fujitsuのドライバ使用条件には抵触するだろうね。
intelのサイトで
Support Home >Drivers & Software>Support Home Drivers & Software>RAID Productsでcentosでfilterすると出てくる
MegaRAID Linux* Drivers
Version: 7.705.04.00 (Latest)
というものも使えるかもしれない。しらんけどw。(この件については自己責任でどーぞ)

ま、無事インストールでき、ファイルサーバ完成。
ちなみに送料は別としてHDD以外の材料費としてはHDDマウンタ2個追加1000円>CPU650円>本体100円とマウンタが一番高かったというw

更に入手したマウンタが世代違いで使えなかったというオチまで・・・

Anacondaの再インストールで躓く

pyenvで仮想化

$ git clone https://github.com/yyuu/pyenv.git ~/.pyenv
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
$ echo 'eval "$(pyenv init -)"' >> ~/.bashrc
$ source ~/.bashrc

anacondaをインストール

$ pyenv install anaconda3-5.3.1
$ pyenv rehash

$ pyenv global anaconda3-5.3.1
$ echo 'export PATH="$PYENV_ROOT/versions/anaconda3-5.3.1/bin/:$PATH"' >> ~/.bashrc
$ source ~/.bashrc
$ conda update conda

深層学習の環境を構築

$ conda install cudatoolkit
$ conda install cudnn

$ conda install python=3.6
$ conda install tensorflow-gpu

という段取りなんだが、condaをアップデートするとconda4.7.10にあげようとする。
ところがこのバージョンはcudatoolkitのインストールが失敗するので

$ conda install conda4.6.14
Solving environment: done

## Package Plan ##

  environment location: /home/kkuro2/.pyenv/versions/anaconda3-5.3.1

  added / updated specs: 
    - conda=4.6.14


The following packages will be downloaded:

    package                    |            build
    ---------------------------|-----------------
    pyopenssl-19.0.0           |           py37_0          82 KB
    _libgcc_mutex-0.1          |             main           3 KB
    ncurses-6.1                |       he6710b0_1         958 KB
    idna-2.8                   |           py37_0         101 KB
    chardet-3.0.4              |        py37_1003         173 KB
    cffi-1.12.3                |   py37h2e261b9_0         222 KB
    conda-4.6.14               |           py37_0         2.1 MB
    pysocks-1.7.0              |           py37_0          29 KB
    urllib3-1.24.2             |           py37_0         153 KB
    libgcc-ng-9.1.0            |       hdf63c60_0         8.1 MB
    pycparser-2.19             |           py37_0         172 KB
    openssl-1.1.1c             |       h7b6447c_1         3.8 MB
    cryptography-2.7           |   py37h1ba5d50_0         608 KB
    ca-certificates-2019.5.15  |                0         133 KB
    six-1.12.0                 |           py37_0          22 KB
    setuptools-41.0.1          |           py37_0         648 KB
    pip-19.1.1                 |           py37_0         1.8 MB
    zlib-1.2.11                |       h7b6447c_3         120 KB
    requests-2.22.0            |           py37_0          89 KB
    certifi-2019.6.16          |           py37_1         156 KB
    libedit-3.1.20181209       |       hc058e9b_0         188 KB
    wheel-0.33.4               |           py37_0          39 KB
    python-3.7.3               |       h0371630_0        36.7 MB
    sqlite-3.29.0              |       h7b6447c_0         1.9 MB
    ------------------------------------------------------------
                                           Total:        58.2 MB

The following NEW packages will be INSTALLED:

    _libgcc_mutex:   0.1-main               

The following packages will be UPDATED:

    ca-certificates: 2018.03.07-0            --> 2019.5.15-0            
    certifi:         2018.8.24-py37_1        --> 2019.6.16-py37_1       
    cffi:            1.11.5-py37he75722e_1   --> 1.12.3-py37h2e261b9_0  
    chardet:         3.0.4-py37_1            --> 3.0.4-py37_1003        
    conda:           4.5.11-py37_0           --> 4.6.14-py37_0          
    cryptography:    2.3.1-py37hc365091_0    --> 2.7-py37h1ba5d50_0     
    idna:            2.7-py37_0              --> 2.8-py37_0             
    libedit:         3.1.20170329-h6b74fdf_2 --> 3.1.20181209-hc058e9b_0
    libgcc-ng:       8.2.0-hdf63c60_1        --> 9.1.0-hdf63c60_0       
    ncurses:         6.1-hf484d3e_0          --> 6.1-he6710b0_1         
    openssl:         1.0.2p-h14c3975_0       --> 1.1.1c-h7b6447c_1      
    pip:             10.0.1-py37_0           --> 19.1.1-py37_0          
    pycparser:       2.18-py37_1             --> 2.19-py37_0            
    pyopenssl:       18.0.0-py37_0           --> 19.0.0-py37_0          
    pysocks:         1.6.8-py37_0            --> 1.7.0-py37_0           
    python:          3.7.0-hc3d631a_0        --> 3.7.3-h0371630_0       
    requests:        2.19.1-py37_0           --> 2.22.0-py37_0          
    setuptools:      40.2.0-py37_0           --> 41.0.1-py37_0          
    six:             1.11.0-py37_1           --> 1.12.0-py37_0          
    sqlite:          3.24.0-h84994c4_0       --> 3.29.0-h7b6447c_0      
    urllib3:         1.23-py37_0             --> 1.24.2-py37_0          
    wheel:           0.31.1-py37_0           --> 0.33.4-py37_0          
    zlib:            1.2.11-ha838bed_2       --> 1.2.11-h7b6447c_3      

Proceed ([y]/n)? y


Downloading and Extracting Packages
pyopenssl-19.0.0     | 82 KB     | ###################################### | 100% 
_libgcc_mutex-0.1    | 3 KB      | ###################################### | 100% 
ncurses-6.1          | 958 KB    | ###################################### | 100% 
idna-2.8             | 101 KB    | ###################################### | 100% 
chardet-3.0.4        | 173 KB    | ###################################### | 100% 
cffi-1.12.3          | 222 KB    | ###################################### | 100% 
conda-4.6.14         | 2.1 MB    | ###################################### | 100% 
pysocks-1.7.0        | 29 KB     | ###################################### | 100% 
urllib3-1.24.2       | 153 KB    | ###################################### | 100% 
libgcc-ng-9.1.0      | 8.1 MB    | ###################################### | 100% 
pycparser-2.19       | 172 KB    | ###################################### | 100% 
openssl-1.1.1c       | 3.8 MB    | ###################################### | 100% 
cryptography-2.7     | 608 KB    | ###################################### | 100% 
ca-certificates-2019 | 133 KB    | ###################################### | 100% 
six-1.12.0           | 22 KB     | ###################################### | 100% 
setuptools-41.0.1    | 648 KB    | ###################################### | 100% 
pip-19.1.1           | 1.8 MB    | ###################################### | 100% 
zlib-1.2.11          | 120 KB    | ###################################### | 100% 
requests-2.22.0      | 89 KB     | ###################################### | 100% 
certifi-2019.6.16    | 156 KB    | ###################################### | 100% 
libedit-3.1.20181209 | 188 KB    | ###################################### | 100% 
wheel-0.33.4         | 39 KB     | ###################################### | 100% 
python-3.7.3         | 36.7 MB   | ###################################### | 100% 
sqlite-3.29.0        | 1.9 MB    | ###################################### | 100% 
Preparing transaction: done
Verifying transaction: done
Executing transaction: done

とうまく動いていた頃のバージョンにアップしてやる。
で、cudatoolkitをインストールするとcondaの最新版が4.7.10だからアップデートを自動でしやがって結果インストールに失敗する。

どうせいっちゅうの。

anacondaおよびcondaのバージョンアップで改善するのを待つか・・・


今できる別の方法を考えてみよう。
まず

$ pyenv install anaconda3-4.3.1
$ pyenv global anaconda3-4.3.1 

python 3.6のanacondaを入れる。
次にcudnnをNVIDIAのサイトからダウンロードしてきて

$ tar zxf cudnn-10.1-linux-x64-v7.6.2.24.tgz
$ sudo cp -a cuda/include/* /usr/local/cuda/include/
$ sudo cp -a cuda/lib64/* /usr/local/cuda/lib64/
$ sudo ldconfig

とcudnnの必要なファイルを手動でインストール
必要かはちょっとわからないが

$ sudo ln -s /usr/local/cuda/include/crt/math_functions.hpp /usr/local/cuda/include/math_functions.hpp
$ sudo ln -s /usr/lib64/libcublas.so.10.1.0.105 /usr/local/cuda-10.1/lib64/libcublas.so.10.1.0.105
$ sudo ln -s /usr/local/cuda-10.1/lib64/libcublas.so.10.1.0.105 /usr/local/cuda-10.1/lib64/libcublas.so.10.1
$ sudo ln -s /usr/local/cuda-10.1/lib64/libcublas.so.10.1 /usr/local/cuda-10.1/lib64/libcublas.so
$ sudo ln -s /usr/local/cuda-10.1/targets/x86_64-linux/lib/libcusolver.so.10.1.105 /usr/local/cuda-10.1/lib64/libcusolver.so.10.1
$ sudo ln -s /usr/local/cuda-10.1/targets/x86_64-linux/lib/libcurand.so.10.1.105 /usr/local/cuda-10.1/lib64/libcurand.so.10.1
$ sudo ln -s /usr/local/cuda-10.1/targets/x86_64-linux/lib/libcufft.so.10.1.105 /usr/local/cuda-10.1/lib64/libcufft.so.10.1

とリンクを張っておいて

$ conda install tensorflow-gpu

とtensorflowをインストールする。
この状態で

$ python
Python 3.6.0 |Anaconda 4.3.1 (64-bit)| (default, Dec 23 2016, 12:22:00) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-1)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from tensorflow.python.client import device_lib
>>> device_lib.list_local_devices()
2019-08-04 15:00:29.442682: W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use SSE4.1 instructions, but these are available on your machine and could speed up CPU computations.
2019-08-04 15:00:29.442754: W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use SSE4.2 instructions, but these are available on your machine and could speed up CPU computations.
2019-08-04 15:00:29.612838: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:893] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2019-08-04 15:00:29.613333: I tensorflow/core/common_runtime/gpu/gpu_device.cc:955] Found device 0 with properties: 
name: GeForce GT 710
major: 3 minor: 5 memoryClockRate (GHz) 0.954
pciBusID 0000:04:00.0
Total memory: 980.94MiB
Free memory: 958.69MiB
2019-08-04 15:00:29.613394: I tensorflow/core/common_runtime/gpu/gpu_device.cc:976] DMA: 0 
2019-08-04 15:00:29.613416: I tensorflow/core/common_runtime/gpu/gpu_device.cc:986] 0:   Y 
2019-08-04 15:00:29.613452: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1045] Creating TensorFlow device (/gpu:0) -> (device: 0, name: GeForce GT 710, pci bus id: 0000:04:00.0)
[name: "/cpu:0"
device_type: "CPU"
memory_limit: 268435456
locality {
}
incarnation: 10112316233564255216
, name: "/gpu:0"
device_type: "GPU"
memory_limit: 769327104
locality {
  bus_id: 1
}
incarnation: 15150163897772535855
physical_device_desc: "device: 0, name: GeForce GT 710, pci bus id: 0000:04:00.0"
]
>>> 

とテストすると、ここまでは問題なくインストールできたことがわかる。
問題はこのあとのkerasでcondaでインストールするとまたcondaのバージョンアップで固まり、サンプルプログラムでは

$ python mnist_cnn.py 
Using TensorFlow backend.
Downloading data from https://s3.amazonaws.com/img-datasets/mnist.npz
11493376/11490434 [==============================] - 4s 0us/step
x_train shape: (60000, 28, 28, 1)
60000 train samples
10000 test samples
Traceback (most recent call last):
  File "mnist_cnn.py", line 57, in <module>
    model.add(Dense(num_classes, activation='softmax'))
  File "/home/kuro/.pyenv/versions/anaconda3-4.3.1/lib/python3.6/site-packages/keras/engine/sequential.py", line 181, in add
    output_tensor = layer(self.outputs[0])
  File "/home/kuro/.pyenv/versions/anaconda3-4.3.1/lib/python3.6/site-packages/keras/engine/base_layer.py", line 457, in __call__
    output = self.call(inputs, **kwargs)
  File "/home/kuro/.pyenv/versions/anaconda3-4.3.1/lib/python3.6/site-packages/keras/layers/core.py", line 883, in call
    output = self.activation(output)
  File "/home/kuro/.pyenv/versions/anaconda3-4.3.1/lib/python3.6/site-packages/keras/activations.py", line 31, in softmax
    return K.softmax(x)
  File "/home/kuro/.pyenv/versions/anaconda3-4.3.1/lib/python3.6/site-packages/keras/backend/tensorflow_backend.py", line 3231, in softmax
    return tf.nn.softmax(x, axis=axis)
TypeError: softmax() got an unexpected keyword argument 'axis'

こんなエラーが出て止まってしまう。
これはなんだ?
なおpipでインストールしても同じエラーが出るので、pythonモジュールに足りないものがあるのかもしれない。

結局

$ conda install keras=2.0.8

と最新版の2.2.4よりちょっと古いバージョンをインストールしてみたところ、とりあえずエラー出さずに完走できることがわかった。
しばらくはこれで様子を見るか。

なお、anaconda環境でpipを使うと最悪環境が壊れてしまうこともあるらしく、あまりおすすめできないとのこと。
なのでcondaでどうにかする方策を基本としたが、condaがバージョンアップしておかしくなっている間は困るのね。

pythonでseq data

相変わらずいろいろ画策中。
やっぱり何が面倒ってab1ファイルを開いて2つ重なったピークを分離するところなわけで。
ピークコールの自動化ができるととても楽ちんになる。

BiopythonモジュールでもSeqデータを見られるらしい。

from Bio import SeqIO
from Bio.SeqIO import AbiIO

test = SeqIO.read('/Volumes/Documents/works/testseq.ab1', 'abi')
print(test.annotations['abif_raw']['DATA1'])
(-7, 6, -7, -4, -8, 1, -4, -1, -3, 0, -2, -12, -3, -4, 6, 3, -4, -4, -1, 2, -3, -15, -6, -5, -8, -4, 1, -14, -8, -4, -3, -7, -6, -8, -3, 0, -3, -6, -12, -10, 0, 0, -15, -7, -14, -8, 0, -10, -2, -13, -3, -10, -8, -8, -14, -3, -9, -7, -10, -7, -8, -5, -5, -11, 0, -7, -1, -8, -6, -6, -4, -2, -13, -10, -5, -6, -9, -8, -4, -6, -19, -11, -11, -8, -6, 0, -2, -6, -8, -13, -5, -8, -4, -7, -6, -4, -10, -4, 
・・・・・・
4, 488, 501, 529, 523, 530, 531, 550, 566, 577, 583, 579, 592, 577, 584, 593, 610, 597, 631, 633, 612, 612, 623, 645, 660, 649, 665, 688, 666, 640, 652, 658, 652, 660, 650, 635, 654, 667, 616, 609, 600, 588, 568, 550, 517, 524, 517, 510, 494, 470, 457, 439, 417, 408, 401, 396, 360, 334, 334, 317, 306, 285, 270, 241, 255, 230, 224, 203, 215, 188, 191, 192, 172, 151, 148, 146, 150, 137, 151, 144, 134, 136, 150, 145, 124, 132, 137, 145, 138, 143, 132, 126, 140, 134)

こんな感じにプロットを出せるのね。
ということはこれを4塩基で重ねていけば、ヘテロで重なったsecondary peakも取れるんだろうか。

とりあえずtestオブジェクトのアトリビュートを確認すると

>>> dir(test)
['__add__', '__bool__', '__class__', '__contains__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__le___', '__len__', '__lt__', '__module__', '__ne__', '__new__', '__nonzero__', '__radd__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_per_letter_annotations', '_seq', '_set_per_letter_annotations', '_set_seq', 'annotations', 'dbxrefs', 'description', 'features', 'format', 'id', 'letter_annotations', 'lower', 'name', 'reverse_complement', 'seq', 'upper']

こんな感じ。
f:id:k-kuro:20190629210025p:plain

>>> test.id
'1I1_F'
>>> test.name
'1I1_F_P1815443_047'
>>> test.seq
Seq('CNGNNNCGAGTCTTTGATGCAGTTGCGCTCGAGGCCATTANGTTGAGAGCACGT...NNN', IUPACUnambiguousDNA())
>>> test.reverse_complement()
SeqRecord(seq=Seq('NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN...CNG', IUPACUnambiguousDNA()), id='<unknown id>', name='<unknown name>', description='<unknown description>', dbxrefs=[])

( ちなみにここで見ているシークエンスファイルはネットに落ちていたもので何かは知らない)
さらにannotationsは

>>> test.annotations.keys()
dict_keys(['sample_well', 'dye', 'polymer', 'machine_model', 'run_start', 'run_finish', 'abif_raw'])
>>> for k,v in test.annotations.items():
...     print('key:'+k+' , values:'+v)
... 
key:sample_well , values:A5
key:dye , values:Z-BigDyeV3
key:polymer , values:POP7                            
key:machine_model , values:3730
key:run_start , values:2018-05-25 18:23:59
key:run_finish , values:2018-05-25 20:38:32
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
TypeError: must be str, not dict

abif_rawキーに対するvalueには

    'DATA1': 'Channel 1 raw data',
    'DATA2': 'Channel 2 raw data',
    'DATA3': 'Channel 3 raw data',
    'DATA4': 'Channel 4 raw data',
    'DATA5': 'Short Array holding measured volts/10 (EP voltage) during run',
    'DATA6': 'Short Array holding measured milliAmps trace (EP current) during run',
    'DATA7': 'Short Array holding measured milliWatts trace (Laser EP Power) during run',
    'DATA8': 'Short Array holding measured oven Temperature (polymer temperature) trace during run',
    'DATA9': 'Channel 9 processed data',
    'DATA10': 'Channel 10 processed data',
    'DATA11': 'Channel 11 processed data',
    'DATA12': 'Channel 12 processed data',

となっているようで、

>>> print(test.annotations['abif_raw']['DATA9'][100])
196

というふうに数値を取り出せる。

ピークを抽出するのはどうする?
9~12のデータの並び順は

>>> print(test.annotations['abif_raw']['FWO_1'])                                
GATC

からGATCの順のようだ。


と、いろいろ調べてきたが、結局2番めに高いピークをひろうにはすでにあるab1 fileではどうにもならないようだ。
ベースコールを行うphredで-dオプションを付けて再解析する必要があるらしい。

しかしPhredのダウンロードサイトが閉じているようで、入手ができそうにない。
Mac,Windowsのデスクトップアプリはあるようなのだけど、それだと自前のwebアプリにビルトインできないからなあ。
やっぱりコマンドラインで動くUnix版がほしいところ。

というわけで代わりにTraceTunerを試してみる。
sourceforge.net

これまたとっつきにくいアプリケーションの雰囲気を漂わせている。CVSだけど、気にせずsrc/に入ってmake
めちゃめちゃワーニングが出るな。

とりあえず、

$ cd ../rel/Linux
$ ./ttuner -h
    -h                   (Help) This message
    -Q                   (Quiet) Turn off status messages
    -V                   (Verbose) Output more status messages
    -nocall              Disable base recalling and just use the original
                         called bases read from the input sample file
    -recalln             Disable adding bases to or deleting from the
                         original called sequence. Only recall Ns
    -het                 Call call hetezygotes
    -mix                 Call mixed bases
    -min_ratio <ratio>   Override the default threshold ratio of heights of
    -trim_window <size>  Set the trimming window size for averaging quality
                         to the specified value. The default is 10.
    -trim_threshold <qv> Set the average quality value used in trimming to
    -C <consensusfile>   Specify the name of the FASTA file which contains
                         the consensus sequence
    -edited_bases        Start base recalling from the ABI's edited bases
    -t <table>           Use specified lookup table. This option overrides
                         the default (automatic choice of the lookup table)
                         as well as the options -3700pop5, -3700pop6, -3100,
                         and -mbace. To get a message showing 
                         which table was used, specify -V option
    -3730                Use the built-in ABI 3730-pop7 lookup table
    -3700pop5            Use the built-in ABI 3700-pop5 lookup table
    -3700pop6            Use the built-in ABI 3700-pop6 lookup table
    -3100                Use the built-in ABI 3100-pop6 lookup table
    -mbace               Use the built-in MegaBACE lookup table
    -c                   Output SCF file(s), in the current directory
    -cd <dir>            Output SCF file(s), in the specified directory
    -cv3                 Use version 3 for output SCF file. Default is
                         version 2.
    -o <dir>             Output multi-fasta files of bases (tt.seq), 
                         their locations (tt.pos), quality values (tt.qual)
                         and status reports (tt.status) to directory <dir>
    -p                   Output .phd.1 file(s), in the current directory
    -pd <dir>            Output .phd.1 file(s), in the specified directory
    -q                   Output .qual file(s), in the current directory
    -qa <file>           Append .qual file(s) to <file>
    -qd <dir>            Output .qual file(s), in the specified directory
    -s                   Output .seq file(s) in FASTA format, in the current
                         directory
    -sa <file>           Append .seq file(s) in FASTA format to <file>
    -sd <dir>            Output .seq file(s) in FASTA format, in the specified
                         directory
    -qr <file>           Output a quality report that gives data for a
                         histogram on the number of reads with quality
                         values >= 20, to the specified file
    -if <file>           Read the input sample filenames from the specified
                         file
    -id <dir>            Read the input sample files from specified directory
    -tab                 Call heterozygotes or mixed bases and output .tab
                          file(s) in the  current directory
    -tabd <dir>          Call mixed bases and output .tab file(s), in the
                         specified directory
    -tal                 Output .tal file(s),in the current directory
    -tald <dir>          Output .tal file(s),in the specified directory

    -hpr                 Output a homopolymer runs file in current directory
    -hprd <dir>          Output a homopolymer runs file(s),in the specified directory

    -d                   Output .poly file(s),in the current directory
    -dd  <dir>           Output .poly file(s),in the specified directory

    -ipd <dir>           Input the original bases and peak locations from a
                         .phd file in the specified directory.

さてオプションがいっぱいあるが

$  /Applications/tracetuner_3.0.6beta/rel/Linux/ttuner -p ./1I1_F_P1815443_047.ab1 

これが最も基本のオプションだろうか。

BEGIN_SEQUENCE 1I1_F_P1815443_047.ab1

BEGIN_COMMENT

CHROMAT_FILE: 1I1_F_P1815443_047.ab1
ABI_THUMBPRINT: 0
PHRED_VERSION: TT_3.0.4beta
CALL_METHOD: ttuner
QUALITY_LEVELS: 45
TIME: Sat Jun 29 21:04:35 2019
TRACE_ARRAY_MIN_INDEX: 0
TRACE_ARRAY_MAX_INDEX: 14037
TRIM: 16 622 0.010000
CHEM: unknown
DYE: big

END_COMMENT

BEGIN_DNA
c 14 114
g 16 118
g 13 135
t 17 138
c 7 154
t 7 168
c 13 176
g 11 183
a 13 199
g 18 203
t 17 219
c 17 223
t 20 235
t 14 245
t 14 255
g 14 259
a 15 276
t 15 289
g 16 295
c 16 306
a 17 319
g 24 330
t 25 346
t 26 357
g 26 364
c 25 376
g 26 387
c 25 399
t 26 414

上に上げたKB basecallerで読まれたシークエンス(チャート)と比べると

CNGNNNCGAGTCTTTGATGCAGTTGCGC
CGGTCTCGAGTCTTTGATGCAGTTGCGC

とまあほぼ一致している。

$  /Applications/tracetuner_3.0.6beta/rel/Linux/ttuner -mix -tab ./1I1_F_P1815443_047.ab1 

こんな感じに投げてみると

# CHROMAT_FILE: 1I1_F_P1815443_047.ab1
# SOFTWARE_VERSION: TT_3.0.4beta
# NUM_ABC: 236
# NUM_SUBSTITUTIONS: 236
# NUM_DELETIONS: 0
# base2   qv2       pos2       ind2
   Y      11         115         0
   T       7         116         0
   S      13         133         2
   C       7         131         2
   A       7         154         4
   C       7         154         4
   M      10         176         6
   A       7         176         6
   K       8         187         7
   T       7         192         7
   M      12         198         8
   C      10         198         8
   W      11         254        14
   T       7         255        14
   R      14         262        15
   S       9         260        15
   A       9         265        15
   C      11         261        15
   M       9         277        16
   C       7         279        16
   W      11         290        17
   A       7         292        17
   W      16         319        20
   T       9         319        20
   T       9         332        21
   G      25         330        21
   W      18         356        23
   A      11         355        23
   Y      11         374        25
   T       9         373        25
   K      24         385        26
   T       9         384        26
   W      23         412        28
   A       9         411        28
・・・・・・・・・・
・・・・・・・・・・

こういうファイルが出来上がるわけだが、これでいいのかな?

CNGNNNCGAGTCTTTGATGCAGTTGCGC
CGGTCTCGAGTCTTTGATGCAGTTGCGC
YTSCACMAKTMCWTRSACMCWAWTTGWAY

なんかおかしいね。

$  /Applications/tracetuner_3.0.6beta/rel/Linux/ttuner -min_ratio 0.1 -d ./1I1_F_P1815443_047.ab1 

こうすると、最も高いピークに加えて10%以上の高さのピークを次に選んでくれそう

1I1_F_P1815443_047.ab1 1.0 1.0 1.0 1.0 1.0
C  114  2990.000000  1.207398  N  -1  -1.000000  -1.000000  51.000000  196.000000  155.000000  79.000000
G  118  3210.000000  1.296236  T  115  912.500000  0.368478  62.000000  140.000000  170.000000  72.000000
G  135  2444.500000  0.987118  C  132  935.500000  0.377766  59.000000  61.000000  208.000000  133.000000
T  138  2012.500000  0.812672  N  -1  -1.000000  -1.000000  37.000000  35.000000  173.000000  154.000000
C  154  3376.500000  1.363471  A  154  3609.500000  1.457559  215.000000  265.000000  0.000000  0.000000
T  168  1846.500000  0.745639  N  -1  -1.000000  -1.000000  25.000000  76.000000  0.000000  133.000000
C  176  2879.000000  1.162575  A  176  268.500000  0.108424  29.000000  224.000000  17.000000  102.000000
G  183  1223.000000  0.493862  N  -1  -1.000000  -1.000000  5.000000  85.000000  122.000000  5.000000
A  199  1633.000000  0.659425  C  198  852.500000  0.344250  136.000000  89.000000  199.000000  0.000000
G  203  3149.000000  1.271604  N  -1  -1.000000  -1.000000  110.000000  44.000000  286.000000  0.000000
T  219  4653.500000  1.879139  N  -1  -1.000000  -1.000000  0.000000  178.000000  4.000000  425.000000
C  223  3368.000000  1.274430  N  -1  -1.000000  -1.000000  0.000000  329.000000  0.000000  299.000000
T  235  2353.000000  0.885069  N  -1  -1.000000  -1.000000  0.000000  0.000000  0.000000  351.000000
T  245  7217.500000  2.724202  N  -1  -1.000000  -1.000000  22.000000  0.000000  0.000000  574.000000
T  255  5279.000000  1.665352  A  252  912.000000  0.287706  94.000000  2.000000  132.000000  536.000000
G  259  2757.000000  0.820499  A  262  726.500000  0.216211  77.000000  36.000000  273.000000  317.000000
A  276  6011.000000  1.741713  C  280  659.000000  0.190948  411.000000  39.000000  0.000000  0.000000
T  289  3652.000000  0.970141  N  -1  -1.000000  -1.000000  101.000000  3.000000  233.000000  404.000000
G  295  8538.000000  2.130612  A  293  841.500000  0.209992  84.000000  0.000000  831.000000  144.000000
C  306  3019.000000  0.642641  N  -1  -1.000000  -1.000000  14.000000  315.000000  11.000000  8.000000
A  319  4293.000000  0.916368  T  318  794.500000  0.169591  312.000000  0.000000  9.000000  73.000000
G  330  4400.000000  0.946491  T  332  857.000000  0.184351  23.000000  0.000000  391.000000  101.000000
T  346  5086.500000  1.070403  N  -1  -1.000000  -1.000000  14.000000  14.000000  1.000000  550.000000
T  357  4582.000000  0.911786  C  352  601.000000  0.119595  46.000000  17.000000  83.000000  510.000000
G  364  6482.000000  1.361264  N  -1  -1.000000  -1.000000  2.000000  0.000000  679.000000  62.000000
C  376  5179.000000  1.060825  T  373  475.000000  0.097295  0.000000  455.000000  0.000000  58.000000
G  387  4755.000000  0.927941  T  383  813.000000  0.158657  0.000000  90.000000  488.000000  46.000000
C  399  6513.500000  1.303052  N  -1  -1.000000  -1.000000  0.000000  592.000000  0.000000  0.000000
T  414  4645.000000  0.878936  A  412  989.000000  0.187140  94.000000  73.000000  0.000000  544.000000
C  421  4935.500000  1.008171  A  421  501.000000  0.102339  57.000000  513.000000  0.000000  66.000000

これかな。

$  /Applications/tracetuner_3.0.6beta/rel/Linux/ttuner -mix -s ./1I1_F_P1815443_047.ab1

こっちでもいいかも

>1I1_F_P1815443_047.ab1 1195 16 579
CGGTMTCGAGTCTTAGATGCAKTTGCGCTCGASGCCATTASSTTGAGAGC
ACGTCTGTTTGGGCGTCATGCCTTGCGTCATTCTAGCCATCCATCTACTC
TCTGTGGGTGATGGGGGATGTGGAGATTGACCTTCCGTGCTTTAATTGTA

なお

R	A or G
Y	C or T
S	G or C
W	A or T
K	G or T
M	A or C
B	C or G or T
D	A or G or T
H	A or C or T
V	A or C or G
N	any base

CRISPRの編集を調べるプログラム

以前、CRISPRによって編集された遺伝子配列を解析するプログラムを書いたが、100%マッチするときしか検出できないのは不便だな、ということで、アライメントを取るツールを利用できないだろうかと考え中。

pairwise2 | BioPython の pairwise2 ライブラリーを利用したペアワイズアラインメント
こちらの情報を参考に、biopythonのpairwise2を使ってみる。

Python 3.6.5 (default, Apr 25 2018, 14:26:36) 
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.39.2)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from Bio import pairwise2
>>> from Bio.pairwise2 import format_alignment
>>> for a in pairwise2.align.localms("ACCGTCC", "ACG", 2, -1, -0.5, -0.1):
...     print(format_alignment(*a))
... 
ACCGTCC
| ||
A-CG---
  Score=5.5

ACCGTCC
|| |
AC-G---
  Score=5.5

なるほど。これで比べる2つ目の配列をregexで混合した配列から使えるとよいのだけれど

例えば

AACTCTGTTGTACTCTGGTCATAATTCCCTCGGCTAATTTAACCCGCT

こんな配列があったとして

シークエンス結果が

AACTCTGTTGTACTCTaatTCtTAccTCCgTCGatTtATT
AACTCTGTTGTACTCTGGGaaAtcATtcgCctaGCtAaac

こんなだったとする。
正解は

AACTCTGTTGTACTCTAGGTCATAATTCCCTCGGCTAATT
                ^
AACTCTGTTGTACTCTG    ATAATTCCCTCGGCTAATTTAAC

こういうふうになっているのだけれど

import regex
>>> w = 'AACTCTGTTGTACTCTGGTCATAATTCCCTCGGCTAATTTAACCCGCT'
>>> s1 = 'AACTCTGTTGTACTCTAATTCTTACCTCCGTCGATTTATT'
>>> s2 = 'AACTCTGTTGTACTCTGGGAAATCATTCGCCTAGCTAAAC'
>>> s = "".join('['+i+j+']' for i, j in zip(s1, s2))
>>> m = regex.finditer(s,w,overlapped=True)
>>> for match in m:
...     print(match.start(), match.group(), match.end())
... 
>>> 

こんなふうに以前作ったアプリではうまくヒットしない。一方はミスマッチのinsertionがあり、もう一方はそれとずれてdeletionが入っているからだ
とはいえpairwise2になんとなく組み込んでみても

>>> for a in pairwise2.align.localms(w, s, 2, -1, -0.5, -0.1):
...     print(format_alignment(*a))
... 
-----AA--C---T---C---T---G---TT------G---T---A---C---T---C---T----G---G--T-------CA--TAA--TT---C--C---CT----------CG--GC--T--------A--A-------TT--TA--A--------CCCGCT
     ||  |   |   |   |   |   ||      |   |   |   |   |   |   |    |   |  |       ||  | |  ||   |  |   ||          ||  ||  |        |  |       ||  ||  |        |
[AA][AA][CC][TT][CC][TT][GG][TT][TT][GG][TT][AA][CC][TT][CC][TT][AG][AG][TG][TA][CA][T-A][TT][AC][CA][CT][TT][CC][CG][GC][TC][CT][GA][AG][TC][TT][TA][AA][TA][TC]----
  Score=59.9
................

これじゃだめだね。
もうちょっと考えよう。

ちなみに

>>> s1 = 'ATTCTTACCTCCGTCGATTTATT'
>>> s2 = 'GGAAATCATTCGCCTAGCTAAAC'
>>> s = "".join('['+i+j+']' for i, j in zip(s1, s2))
>>> m = regex.finditer(s,w,overlapped=True)
>>> for match in m:
...     print(match.start(), match.group(), match.end())
... 
16 GGTCATAATTCCCTCGGCTAATT 39
20 ATAATTCCCTCGGCTAATTTAAC 43
>>> 

こういうふうに投げる配列をうまく調整すると答えにだいたいたどり着けるのだけど、どれくらいの位置にどれくらいdeletionが入っているのかというのが運次第というのではちょっとね。

>>> s1 = 'AACTCTGTTGTACTCTAATTCTTACCTCCGTCGATTTATT'
>>> s2 = 'AACTCTGTTGTACTCTGGGAAATCATTCGCCTAGCTAAAC'
>>> s = "".join('['+i+j+']' for i, j in zip(s1, s2))
>>> n = 1
>>> while s:
...     m = regex.finditer(s,w,overlapped=True)
...     print(str(n)+': '+s)
...     for match in m:
...             print(match.start(), match.group(), match.end())
...     s = s[4:]
...     n += 1
... 
1: [AA][AA][CC][TT][CC][TT][GG][TT][TT][GG][TT][AA][CC][TT][CC][TT][AG][AG][TG][TA][CA][TA][TT][AC][CA][CT][TT][CC][CG][GC][TC][CT][GA][AG][TC][TT][TA][AA][TA][TC]
2: [AA][CC][TT][CC][TT][GG][TT][TT][GG][TT][AA][CC][TT][CC][TT][AG][AG][TG][TA][CA][TA][TT][AC][CA][CT][TT][CC][CG][GC][TC][CT][GA][AG][TC][TT][TA][AA][TA][TC]
3: [CC][TT][CC][TT][GG][TT][TT][GG][TT][AA][CC][TT][CC][TT][AG][AG][TG][TA][CA][TA][TT][AC][CA][CT][TT][CC][CG][GC][TC][CT][GA][AG][TC][TT][TA][AA][TA][TC]
4: [TT][CC][TT][GG][TT][TT][GG][TT][AA][CC][TT][CC][TT][AG][AG][TG][TA][CA][TA][TT][AC][CA][CT][TT][CC][CG][GC][TC][CT][GA][AG][TC][TT][TA][AA][TA][TC]
5: [CC][TT][GG][TT][TT][GG][TT][AA][CC][TT][CC][TT][AG][AG][TG][TA][CA][TA][TT][AC][CA][CT][TT][CC][CG][GC][TC][CT][GA][AG][TC][TT][TA][AA][TA][TC]
6: [TT][GG][TT][TT][GG][TT][AA][CC][TT][CC][TT][AG][AG][TG][TA][CA][TA][TT][AC][CA][CT][TT][CC][CG][GC][TC][CT][GA][AG][TC][TT][TA][AA][TA][TC]
7: [GG][TT][TT][GG][TT][AA][CC][TT][CC][TT][AG][AG][TG][TA][CA][TA][TT][AC][CA][CT][TT][CC][CG][GC][TC][CT][GA][AG][TC][TT][TA][AA][TA][TC]
8: [TT][TT][GG][TT][AA][CC][TT][CC][TT][AG][AG][TG][TA][CA][TA][TT][AC][CA][CT][TT][CC][CG][GC][TC][CT][GA][AG][TC][TT][TA][AA][TA][TC]
9: [TT][GG][TT][AA][CC][TT][CC][TT][AG][AG][TG][TA][CA][TA][TT][AC][CA][CT][TT][CC][CG][GC][TC][CT][GA][AG][TC][TT][TA][AA][TA][TC]
10: [GG][TT][AA][CC][TT][CC][TT][AG][AG][TG][TA][CA][TA][TT][AC][CA][CT][TT][CC][CG][GC][TC][CT][GA][AG][TC][TT][TA][AA][TA][TC]
11: [TT][AA][CC][TT][CC][TT][AG][AG][TG][TA][CA][TA][TT][AC][CA][CT][TT][CC][CG][GC][TC][CT][GA][AG][TC][TT][TA][AA][TA][TC]
12: [AA][CC][TT][CC][TT][AG][AG][TG][TA][CA][TA][TT][AC][CA][CT][TT][CC][CG][GC][TC][CT][GA][AG][TC][TT][TA][AA][TA][TC]
13: [CC][TT][CC][TT][AG][AG][TG][TA][CA][TA][TT][AC][CA][CT][TT][CC][CG][GC][TC][CT][GA][AG][TC][TT][TA][AA][TA][TC]
14: [TT][CC][TT][AG][AG][TG][TA][CA][TA][TT][AC][CA][CT][TT][CC][CG][GC][TC][CT][GA][AG][TC][TT][TA][AA][TA][TC]
15: [CC][TT][AG][AG][TG][TA][CA][TA][TT][AC][CA][CT][TT][CC][CG][GC][TC][CT][GA][AG][TC][TT][TA][AA][TA][TC]
16: [TT][AG][AG][TG][TA][CA][TA][TT][AC][CA][CT][TT][CC][CG][GC][TC][CT][GA][AG][TC][TT][TA][AA][TA][TC]
17: [AG][AG][TG][TA][CA][TA][TT][AC][CA][CT][TT][CC][CG][GC][TC][CT][GA][AG][TC][TT][TA][AA][TA][TC]
18: [AG][TG][TA][CA][TA][TT][AC][CA][CT][TT][CC][CG][GC][TC][CT][GA][AG][TC][TT][TA][AA][TA][TC]
16 GGTCATAATTCCCTCGGCTAATT 39
20 ATAATTCCCTCGGCTAATTTAAC 43
19: [TG][TA][CA][TA][TT][AC][CA][CT][TT][CC][CG][GC][TC][CT][GA][AG][TC][TT][TA][AA][TA][TC]
17 GTCATAATTCCCTCGGCTAATT 39
21 TAATTCCCTCGGCTAATTTAAC 43
20: [TA][CA][TA][TT][AC][CA][CT][TT][CC][CG][GC][TC][CT][GA][AG][TC][TT][TA][AA][TA][TC]
18 TCATAATTCCCTCGGCTAATT 39
22 AATTCCCTCGGCTAATTTAAC 43
21: [CA][TA][TT][AC][CA][CT][TT][CC][CG][GC][TC][CT][GA][AG][TC][TT][TA][AA][TA][TC]
19 CATAATTCCCTCGGCTAATT 39
23 ATTCCCTCGGCTAATTTAAC 43
22: [TA][TT][AC][CA][CT][TT][CC][CG][GC][TC][CT][GA][AG][TC][TT][TA][AA][TA][TC]
20 ATAATTCCCTCGGCTAATT 39
24 TTCCCTCGGCTAATTTAAC 43
23: [TT][AC][CA][CT][TT][CC][CG][GC][TC][CT][GA][AG][TC][TT][TA][AA][TA][TC]
21 TAATTCCCTCGGCTAATT 39
25 TCCCTCGGCTAATTTAAC 43
24: [AC][CA][CT][TT][CC][CG][GC][TC][CT][GA][AG][TC][TT][TA][AA][TA][TC]
22 AATTCCCTCGGCTAATT 39
26 CCCTCGGCTAATTTAAC 43
25: [CA][CT][TT][CC][CG][GC][TC][CT][GA][AG][TC][TT][TA][AA][TA][TC]
23 ATTCCCTCGGCTAATT 39
27 CCTCGGCTAATTTAAC 43
26: [CT][TT][CC][CG][GC][TC][CT][GA][AG][TC][TT][TA][AA][TA][TC]
24 TTCCCTCGGCTAATT 39
28 CTCGGCTAATTTAAC 43
27: [TT][CC][CG][GC][TC][CT][GA][AG][TC][TT][TA][AA][TA][TC]
25 TCCCTCGGCTAATT 39
29 TCGGCTAATTTAAC 43
28: [CC][CG][GC][TC][CT][GA][AG][TC][TT][TA][AA][TA][TC]
26 CCCTCGGCTAATT 39
30 CGGCTAATTTAAC 43
29: [CG][GC][TC][CT][GA][AG][TC][TT][TA][AA][TA][TC]
27 CCTCGGCTAATT 39
31 GGCTAATTTAAC 43
30: [GC][TC][CT][GA][AG][TC][TT][TA][AA][TA][TC]
28 CTCGGCTAATT 39
32 GCTAATTTAAC 43
31: [TC][CT][GA][AG][TC][TT][TA][AA][TA][TC]
29 TCGGCTAATT 39
33 CTAATTTAAC 43
32: [CT][GA][AG][TC][TT][TA][AA][TA][TC]
30 CGGCTAATT 39
34 TAATTTAAC 43
33: [GA][AG][TC][TT][TA][AA][TA][TC]
31 GGCTAATT 39
35 AATTTAAC 43
34: [AG][TC][TT][TA][AA][TA][TC]
32 GCTAATT 39
36 ATTTAAC 43
35: [TC][TT][TA][AA][TA][TC]
33 CTAATT 39
37 TTTAAC 43
36: [TT][TA][AA][TA][TC]
21 TAATT 26
34 TAATT 39
38 TTAAC 43
37: [TA][AA][TA][TC]
21 TAAT 25
22 AATT 26
34 TAAT 38
35 AATT 39
39 TAAC 43
38: [AA][TA][TC]
0 AAC 3
22 AAT 25
23 ATT 26
35 AAT 38
36 ATT 39
40 AAC 43
39: [TA][TC]
1 AC 3
3 TC 5
7 TT 9
11 AC 13
13 TC 15
18 TC 20
20 AT 22
23 AT 25
24 TT 26
25 TC 27
29 TC 31
36 AT 38
37 TT 39
38 TT 40
41 AC 43
40: [TC]
2 C 3
3 T 4
4 C 5
5 T 6
7 T 8
8 T 9
10 T 11
12 C 13
13 T 14
14 C 15
15 T 16
18 T 19
19 C 20
21 T 22
24 T 25
25 T 26
26 C 27
27 C 28
28 C 29
29 T 30
30 C 31
33 C 34
34 T 35
37 T 38
38 T 39
39 T 40
42 C 43
43 C 44
44 C 45
46 C 47
47 T 48

というわけでちょっと改良して、前から1文字分ずつ削っていって、合致する配列が現れるポイントを探る感じにしてみた。
下の方の数文字しかないところは全く意味がないので削る文字数の制限とかつけるともっと見やすい感じになるかも。


というわけでかなり作り込みました。
f:id:k-kuro:20190620125433p:plain

これはかなりいい感じじゃなかろうか

またまたサーバの構成をいじる

サーバ   CPU               メモリ            理論性能
RX1330M3 E3-1230v6(4C/8T, 3.50GHz)   2400 UDIMM 64GB  224.0GFLOPS
RX300S7  E5-2667(6C/12T, 2.90GHz)x2  1600 LV-RDIMM 32GB 278.4GFLOPS
RX300S7  E5-2643(4C/8T, 3.30GHz)x2  1600 LV-UDIMM 24GB    211.2GFLOPS
RX200S7  E5-2630(6C/12T, 2.30GHz)x2  1333 RDIMM 40GB  220.8GFLOPS
RX300S7  E5-2620(6C/12T, 2.00GHz)x2  1600 LV-RDIMM 24GB   192.0GFLOPS    

RX200S6  E5630(4C/8T, 2.50GHz)x2   1333 RDIMM 12GB     80.0GFLOPS         #GPU test機
RX200S6  E5630(4C/8T, 2.50GHz)x2   1333 UDIMM 4GB     80.0GFLOPS   #バックアップ機

ちょいとCPUとメモリを追加して、構成をいじってみた。

ヒートシンクを調達すればE5-2630L→E5-2620 x2 192.0GFLOPSにアップできるので、これもそのうち。
ただし、いまあんまり重いデータ解析をやってないので、ほぼ趣味の範疇に入るかも。
それよりはGPUのバージョンアップのほうが優先かも。
(それよりは深層学習をちゃんと理解できるレベルまで勉強するほうが先決)
(ていうか論文書けよ)


追記
ヒートシンクを調達し、RX300S7をE5-2620 x 2CPUにした。クラスタはこれで十分かな。RX200S6は基本テスト用途かな。
バックアップ機はファンの音が結構うるさいので連続通電運転は辛い。
現状余っている機材はE5-2630L、E5603

ディープラーニングちょっとずつ

なかなか先に進まないが、とりあえずちょとでもいじってみるか。
f:id:k-kuro:20190615223410p:plain
jupyter notebookの使い方を確かめながらmnistのデータを使った練習をやってみる。

いろいろわからないまま言われるままに入力し、その出力をまずは眺めてみる。