kuroの覚え書き

96の個人的覚え書き

multi FASTA (DNA)からmulti FASTA (Amino Acid)を機械的に作成する(その2)

ちょっと調べたらいけそうな気がしてきた。Biopythonを使うといろいろ簡単にできる模様。

まずはmultifastaを開いて配列を順番に読み込む

import sys
from Bio import SeqIO

fasta_file = sys.argv[1]

for record in SeqIO.parse(fasta_file, 'fasta'):
    ids = record.id
    desc = record.description
    seq = record.seq

    print('id:', ids)
    print('desc:', desc)
    print('seq:', seq)

とりあえずこんなスクリプトfasta_in.pyという名前で作れば

$ python3 fasta_in.py <fasta_file.fasta>

という感じに投げるとidと説明書きとシークエンスを取り出すことができる。

bioinformatics - Python find longest ORF in DNA sequence - Stack Overflow
そんでもって最長ORFはここに出ている例を使って取り出せるので

import sys
from Bio import SeqIO
import re

fasta_file = sys.argv[1]

for record in SeqIO.parse(fasta_file, 'fasta'):
    for strand, seq in (1, record.seq), (-1, record.seq.reverse_complement()):
        for frame in range(3):
            index = frame
            while index < len(record) - 6:
                match = re.match('(ATG(?:\S{3})*?T(?:AG|AA|GA))', str(seq[index:]))
                if match:
                    orf = match.group()
                    index += len(orf)
                    if len(orf) > 1300:
                        pos = str(record.seq).find(orf) + 1
                        print(">{}, pos {}, length {}, strand {}, frame {}".format\
                           (record.id, pos, len(orf), strand, frame ))
                        print(orf)
                else: index += 3

これでいいかな?と思ったが、なんかおかしい。

そもそもcDNAのfastaを見ているのでstrandは1方向固定でいいから

for strand, seq in (1, record.seq), (-1, record.seq.reverse_complement()):

このforループはいらないな。
matchじゃなくてfindallのほうがいいかな?
もうちょっと調べる。

import sys
from Bio import SeqIO
import re

fasta_file = sys.argv[1]

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:
        print(">" + record.id)
        print(match)

これで最長ORFを取り出せた。
あとはこれをアミノ酸に置き換える。

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

fasta_file = sys.argv[1]

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)
        print(">" + record.id)
        print(seq.translate())

できた。これで一気に処理できる。
問題があるとすると、stopコドンがなくて尻切れトンボのORFを持つcDNAからはアミノ酸を読み出せないことかな。

pythonでABIのシークエンスデータをゴニョゴニョする

シークエンスファイルとかfastaファイルとかMacのApEとかで開いてどうにかするのがだんだん億劫になってきた。
pythonでどうにかあんなことやこんなことができないかと調査中

abifpy · PyPI

まあこんなモジュールでも使えばどうにかなりそうな感じ。
引き続き使い方を調査だ。

ところで企業再編の嵐が吹き荒れた結果、Applied BiosystemsもThermoFisherグループに組み込まれちゃったんだな。
キャピラリーシークエンサーが登場したときはすげーもんが出てきたもんだと・・・年がバレる。
そういえば昔は"ABI"って呼んでたよな。ABI Prism 310とかって。Iってなんだったんだ?Industory?
Incか。今どきの若者はABIとか呼ばないのかな。だってIncとしては存在してないからな。


さて、モジュールを早速使ってみよう。

$ python3
Python 3.6.1 (v3.6.1:69c0db5050, Mar 21 2017, 01:21:04) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from abifpy import Trace
>>> test = Trace('good_example_control.ab1')
>>> test.seq
'NNNNNNGGGGCATCCTGTGTTCTACCTGGCACCTGTCCCCATAGAAATGAGCGTGAGTGCCCGGGATCTGCTGCGGGGCTGTGCTGGGCTCTTTCTCAGCCTGGCCCGAAGTTTCCAGATCTGATTGAGCGAGAGAGCAGCAGGACCTGCCCCTCTGCTGGGCTCTTACCTTCGCGGCACTCGCCACTGCCCAGCAGCAGGTGAGGCCCAACACAACCAGTTGCAGGCGCCCCATGGTGAGCATCAGCCTCTGGGTGGCCCTCCCTCTGGGCCTCGGGTATTTATGGAGCTGGATCCAAGGTCACATGCTTGTTCATGAGCTCTCAGGCA'

なるほどabifpyからTraceを読み込んでおいてtestオブジェクトににab1ファイルのデータを並べて記述、という感じなのかな。

>>> test.qual
"&%&'''*+*11.4JKIP>_UOPABKYPRDA?P_\\__\\__L:W\\L\\_HAW\\R\\\\OW_\\\\\\\\_\\WWY\\M_\\\\\\\\WT\\___\\_________\\__WRRW_\\\\ORRRRK___\\_YS____\\\\Y_\\________\\___\\_\\_\\__\\___RBW______W___________KWWRW_RR_\\___\\_\\__\\__\\\\\\\\\\______\\__\\_\\_WWKW___\\_Y_\\\\W_\\_____\\\\_YS__W_\\\\_\\OW_Y_\\__\\CW_YWW__WY____\\Y833)2-_______\\\\YDW_____W__\\____W___\\_____\\_\\__WW____RLY>G<(2R\\_\\3A=3"

これの意味するところはなんだろか。
asciiコードなのか。

           51  3      71  G      91  [     111  o
           52  4      72  H      92  \     112  p
33  !      53  5      73  I      93  ]     113  q
34  "      54  6      74  J      94  ^     114  r
35  #      55  7      75  K      95  _     115  s
36  $      56  8      76  L      96  `     116  t
37  %      57  9      77  M      97  a     117  u
38  &      58  :      78  N      98  b     118  v
39  '      59  ;      79  O      99  c     119  w
40  (      60  <      80  P     100  d     120  x
41  )      61  =      81  Q     101  e     121  y
42  *      62  >      82  R     102  f     122  z
43  +      63  ?      83  S     103  g     123  {
44  ,      64  @      84  T     104  h     124  |
45  -      65  A      85  U     105  i     125  }
46  .      66  B      86  V     106  j     126  ~
47  /      67  C      87  W     107  k
48  0      68  D      88  X     108  l 
49  1      69  E      89  Y     109  m 
50  2      70  F      90  Z     110  n

で、ASCII code=Q+33なので、

>>> test.qual_val
[5, 4, 5, 6, 6, 6, 9, 10, 9, 16, 16, 13, 19, 41, 42, 40, 47, 29, 62, 52, 46, 47, 32, 33, 42, 56, 47, 49, 35, 32, 30, 47, 62, 59, 62, 62, 59, 62, 62, 43, 25, 54, 59, 43, 59, 62, 39, 32, 54, 59, 49, 59, 59, 46, 54, 62,・・・・

とこんな感じになるのだな。

>>> test.data['well']
'E10'
>>> test.data['model']
'3730'
>>> test.data['run start date']
datetime.date(2017, 9, 6)

この辺はシークエンサーの情報や、作業日時など

multi FASTA (DNA)からmulti FASTA (Amino Acid)を機械的に作成する

やりたいことは
複数の遺伝子のcDNA情報をまとめて記載したFASTA形式のファイルがあったとして、それをアミノ酸に翻訳し、clustalw等でアライメントを作成する。
cDNA情報はUTRを含んでいたりいなかったりまちまちである。
フレームを3フレームともチェックし、最も長いORFが作れるものを選択。
MetからStopまでを取り出してFASTA形式で保存する。
というもの。
これまで、そういうことをやってくれるウェブサービス
http://shigen.nig.ac.jp/tools/translatorV2/
を利用していたのだが、あろうことかサービスが閉じられてしまった。
研究ツールは公開するならやっぱりソースも公開しておいてほしいなあ。そうすればローカルで使い続けられるのに。

ということで自前でそういう処理をできないか模索中
DNA の翻訳 | Python を利用して DNA をアミノ酸配列に翻訳する方法

スマニュー砲キター

f:id:k-kuro:20190512154452p:plain

これが噂のスマートニュース?
全然アクセスが上がっている感じはないですがね。

で、スマホにアプリを入れてみたけど、どこからリンクされているのか見つけられんかった。

f:id:k-kuro:20190512172810p:plain
肝心のアクセスは・・・ぜんぜん変わりません。あれえ?

ま、アフィリエイトとかやってるわけじゃないしどうでもいいっちゃあどうでもいいんだけど。

文字列とQRコードを並べて合体した画像を作成する。

テプラには文字列からQRコードを生成して、テープに印字する機能があるのだが、このQRコード生成と文字情報の印字の入力は別系統な操作が必要で結構面倒臭い。
なので、QRコードと文字情報をまとめて画像にしてしまって画像挿入機能一操作だけで完結できるようにすると良いのではないかな。
ということでQR生成と合わせて文字も画像化してこれらを合体してやりたい。
QR生成と文字の画像化まではできているのであとは合体だな。

これにはpillowモジュールが使えるようだ。
要するに新規画像を作成して、その画像の適当な座標にパーツとなる画像をprintするという手順のようだ。
つなげ合わせる画像のサイズにぴったりの余白のない合成画像を作りたければ、それぞれの画像のサイズを調べてそれらを足し算した新規画像を用意すると良いというわけ。

    from PIL import ImageFont
    from PIL import Image
    from PIL import ImageDraw

    fontFile = 'ipaexg.ttf'
    font = ImageFont.truetype(fontFile, 64, encoding='utf-8')

    p_id2 = 'ID: ' + p_id
    w, h = font.getsize(p_id2)
    print('%s w:%d h:%d' % (p_id2, w, h))
    im = Image.new('RGB', (w, h), (255,255,255))
    draw = ImageDraw.Draw(im)
    draw.text((0, 0), p_id2, fill=(0,0,0), font=font)
    data = dir + '/id_' + p_id + '_id.png'
    im.save(data)

    plant_id = 'Plant: ' + plant_id
    w, h = font.getsize(plant_id)
    print('%s w:%d h:%d' % (plant_id, w, h))
    im = Image.new('RGB', (w, h), (255,255,255))
    draw = ImageDraw.Draw(im)
    draw.text((0, 0), plant_id, fill=(0,0,0), font=font)
    data = dir + '/id_' + p_id + '_pid.png'
    im.save(data)

    p_date ='Date: ' + p_date
    w, h = font.getsize(p_date)
    print('%s w:%d h:%d' % (p_date, w, h))
    im = Image.new('RGB', (w, h), (255,255,255))
    draw = ImageDraw.Draw(im)
    draw.text((0, 0), p_date, fill=(0,0,0), font=font)
    data = dir + '/id_' + p_id + '_pdt.png'
    im.save(data)

    owner = 'Owner: ' + owner
    w, h = font.getsize(owner)
    print('%s w:%d h:%d' % (owner, w, h))
    im = Image.new('RGB', (w, h), (255,255,255))
    draw = ImageDraw.Draw(im)
    draw.text((0, 0), owner, fill=(0,0,0), font=font)
    data = dir + '/id_' + p_id + '_own.png'
    im.save(data)

ここまでで4つの文字データを画像データに変換している。

    im0 = Image.open(dir + '/id_' + p_id + '_id.png')
    im1 = Image.open(dir + '/id_' + p_id + '_pid.png')
    im2 = Image.open(dir + '/id_' + p_id + '_pdt.png')
    im3 = Image.open(dir + '/id_' + p_id + '_own.png')
    w0, h0 = im0.size
    w1, h1 = im1.size
    w2, h2 = im2.size
    w3, h3 = im3.size

ここで書く画像のサイズを調べている

    w = max(w0, w1, w2, w3)

こうやって一番大きい画像に合わせて画像を作成すれば無駄が出ないはずなんだけど、なぜかエラーが出てうまくいかない・・・
maxに必要なモジュールってなんかいるのかな?
仕方がないので、とりあえず横幅は十分なサイズで一律固定として処理する。

    w = 800
    h = h0+h1+h2+h3
    im = Image.new('RGB', (w, h), (255,255,255))
    im.paste(im0, (0, 0))
    im.paste(im1, (0, h0))
    im.paste(im2, (0, h0 + h1))
    im.paste(im3, (0, h0 + h1 + h2))
    data = dir + '/id_' + p_id + '_merge.png'
    im.save(data)

    im1 = Image.open(dir + '/id_' + p_id + '.png')
    im2 = Image.open(dir + '/id_' + p_id + '_merge.png')
    w1, h1 = im1.size
    w2, h2 = im2.size

    im = Image.new('RGB', (w1 + w2, h1), (255,255,255))
    im.paste(im1, (0, 0))
    im.paste(im2, (w1, 30))
    data = dir + '/id_tag.png'
    im.save(data)

こんな感じに座標を指定して貼り付けてやればいいのだね。


ちなみに12mm幅のテープに印刷したらQRのドットが抜けてしまうのか読み取れず18mmのテープが必要であった。
テプラのソフトで生成した QRコードだと読めたんだけどな。まあ4段に組んだ文字列は12mmじゃ虫眼鏡で見ないと読めないから18mmでいいんだけど。

QRコードをpythonで作る(その2)

QRコード生成をFlaskのwebアプリから行ってみる。
2つのパターンを想定。
前もってデータベースのIDごとのQRコードを生成。
データベースの1エントリーからQRコードを生成。

from functools import wraps
from flask import request, redirect, url_for, render_template, session
from flask_wtf import FlaskForm
from werkzeug import secure_filename
from wtforms import StringField, IntegerField, SubmitField, BooleanField
from ..models import Test
from testDB import Session
import os, shutil,, qrcode

class qrForm(FlaskForm):
    id = StringField('ID')
    qr1 = IntegerField('min')
    qr2 = IntegerField('max')
    submit = SubmitField('Submit')

@app.route('/qr/', methods=['GET', 'POST'])
def qr_index():
    form = qrForm()
    p_id = request.args.get('id', type = str)
    session = Session()
    q = session.query(Test)

# qr1~qr2の連番でQRコードをまとめて生成する。
    if form.qr1.data:
        dir = "./qr"
        if os.path.exists(dir):
            shutil.rmtree(dir)
        if not os.path.exists(dir):
            os.makedirs(dir)
        min = form.qr1.data
        max = form.qr2.data + 1
        for qr in range(min, max):
            qr = str(qr)
            img = qrcode.make('http://k-kuro.hatenadiary.jp/test_edit/?id=' + qr)
            data = dir + "/id_" + qr + '.png'
            img.save(data)
        flash('QR codes generated')


#データベースから1エントリーを選んでQRコードを生成。
    if p_id:
        # q = q.filter(Test.id==p_id).one()
        # plant_id = q[2]
        # date = q[4]
        # owner = q[8]   #この辺はまだ実装していない
        dir = "./qr"
        if os.path.exists(dir):
            shutil.rmtree(dir)
        if not os.path.exists(dir):
            os.makedirs(dir)
        img = qrcode.make('http://k-kuro.hatenadiary.jp/test_edit/?id=' + p_id)
        data = dir + "/id_" + p_id + '.png'
        img.save(data)
        flash('QR code generated')
    return render_template('qr.html', form=form, contents=q)

だいたいこんな感じで./qrディレクトリに画像が作られることを確認。
これをダウンロードする仕組みとテプラなり、タックシールなりに印刷する手段を考えないと。

#今回のアドレスは架空。

for loopの中でintとstrを連結しようとしてハマったのはお約束。
やっぱりちゃんとローカルでテストしながらやらないと遠回りになるな

次は文字を画像化してQRコードと連結してテプラで印刷しやすいように加工だ。
f:id:k-kuro:20190501194050p:plain
こんな感じ

Pillow(PIL)で文字列を画像として保存(位置・サイズ自動調整) - cloverrose's blog
指定のフォントファイルを使って描画した文字列を画像ファイルに保存 - 強火で進め
Python, Pillowで画像を縦・横に連結(結合) | note.nkmk.me
この辺を参考に

fontとしてIPAフォントを使ってみる
IPAexフォント/IPAフォント | IPAフォントのダウンロードサイトです

import sys
from PIL import ImageFont
from PIL import Image
from PIL import ImageDraw

fontFile = 'ipaexg.ttf'
font = ImageFont.truetype(fontFile, 64, encoding='utf-8')

text = u'謹賀新年'
w, h = font.getsize(text)

print('%s w:%d h:%d' % (text, w, h))

im = Image.new('RGB', (w, h), (255,255,255))
draw = ImageDraw.Draw(im)
draw.text((0, 0), text, fill=(0,0,0), font=font)

im.show() 
im.save('image.png')

載っていたコードをちょいといじってpython3で実行してみた。
f:id:k-kuro:20190501220442p:plain
なぜ謹賀新年w
あ、今日から令和。おめでとう。

QRコードをpythonで作る

ラボの物品や実験植物の管理をやりたい。
サーバにデータを置いておいて、WEBアプリで管理できるようにし、物品をQRコードで紐づけておく。物品にそのQRコードを貼り付けておいて、スマホカメラで見ると、WEBに飛んでその場でデータを編集、statusを変更などできるようにする。

まあSQLベースのwebアプリはもうチョチョイと作成できたので、あとはQRコードだな。

Pythonの「qrcode」を使ってQRコードを生成する - Qiita

このページを参考にするならpythonに pillowと qrcodeというmoduleを入れておいて

>>> import qrcode
>>> img = qrcode.make('http://k-kuro.hatenadiary.jp/entry/20190423/1556028585')
>>> img.save('test1.png')

これだけでQRコードは生成完了。
webで表示させると
f:id:k-kuro:20190428222250p:plain

こんな感じに確かにできている。(このQRはこのサイトの一つ前のエントリー)

これをラベルシートに印刷して物品に貼り付けておけば、スマホで管理できるわけだ。

プロジェクト進捗管理とコミュニケーションツールの構築

現在ラボメンバー間の情報共有にはSlack、Benchiling、Google calendarとバラバラのツールを使っている。
そこにプロジェクト進捗管理グループウェアを追加しようということになったので、RedMineをサーバに立ち上げてみた。
だが、うちのサーバはファイアウォール内のサーバなので、外からアクセスできなくて不便。
ということで次に、外にレンタルしているサーバValue-serverにRedMineを入れようと頑張ってみたものの、rootが使えないとやはり構築に苦労した。
第一RedMineはITバリバリじゃないメンバーには敷居が高すぎて、試験運用してもさっぱり使ってもらえなかったという反省もあって、低機能だけどとっつきやすい、まあ、ToDoメモに毛の生えたくらいのツールを自前で用意するか、ということになった。
Value-serverで標準で使えるようになっているWEBツールはWordPressMovableTypeXOOPSの3つ。
とりあえずこれまでに使用経験のあるXOOPSでサイト構築を始めてみたのだが、XOOPSってすっかりオワコンなのか、情報も更新も止まって久しい感じで全然うまく構築できない。
MovableTypeも一瞬かじったことがあるといえばあるが、結局、現在WordPressの一人勝ちじゃなかろうか、ということでWordPressを初めてまともに触ることになった。
Value-serverで簡単にインストールできるようになっているので、特に問題なくインストールは完了。
テーマはシンプルなのが良かろうということでDanというものを使ってみる。
メインの進捗管理はCollabPressというプラグインを使うことにし、登録メンバーのみアクセスできるサイトとすべく、WP Maintenance Modeというプラグインを入れる。
f:id:k-kuro:20190423225129p:plain
権限を設定し
f:id:k-kuro:20190423225227p:plain
アクセスを制限していることを示す入り口を設定

またCollabPressは
f:id:k-kuro:20190423225321p:plain
こんなふうに制限をかけておく

登録するユーザーは
f:id:k-kuro:20190423225436p:plain
寄稿者レベルにしておく

さて、これでプロジェクト管理はそれなりにできるようになったので、もう一点。Slackは無料プランでやっているがデータをやり取りしているとあっという間に容量制限に達してしまい、投稿できないということが起こっていたので、どうにかしたいと思っていた。そこで、WPのブログ、及びコメントを利用して、データのやり取りができるようにしてやることにした。ただし、WPではSlackのような携帯アプリとかないので投稿があったときに通知を受けることができないのは問題だ。そこでWPに書き込み、データアップロードしたら、その旨Slackに通知を飛ばすプラグイン、その名もSlackをインストールした。
f:id:k-kuro:20190423230104p:plain
このプラグインはSlackのWEB APIを利用して通知を送るようになっている。

f:id:k-kuro:20190423230351p:plain
incoming-webhookというのをSlackの設定からひらき、接続したいチャンネルを選択して
f:id:k-kuro:20190423230610p:plain
インテグレーションの追加をポチッと。

WPのダッシュボードにできたSlack というタブで
f:id:k-kuro:20190423230914p:plain
こんな感じに設定して出来上がり。

キーボードレイアウトの設定

サーバにはCentOS7をインストールして使っている。
基本的にサーバにはsshvncで接続して使っているわけだが、端末としてはMacOSXを使用しており、キーボードもmacの(それもかなりレガシーな)US配列のものを使っているため、いまいちキーマップが一致せず、意図した動作ができないということが多かったので、その辺の環境を一度整理してみることにした。あとあまり必要ではないのだけれど日本語の入力、表示も一応できるようにしたい。

初期状況:
CentOS7はlocaleを日本語としている。
super keyが割り当てられていない?
日本語入力ができない。
Macで作成した日本語ファイルが文字化けする。日本語をmacからCentOSにコピペすると化ける。

まず行ったこと:日本語入力環境を入れる。
アプリケーション→システムツール→設定
を開く
地域と言語を選択すると
f:id:k-kuro:20190421191828p:plain
こんな感じになっている。入力ソースに日本語、とあるから日本語が入力できるのかと思ったら、どうやらできない。
したのプラスボタンを押して
f:id:k-kuro:20190421192005p:plainf:id:k-kuro:20190421192028p:plain
日本語(かな漢字)を追加してやると入力、漢字変換もできるようになるというわけ。
f:id:k-kuro:20190421192148p:plain
変換のショートカットなどを変更するならここをいろいろいじる。

で、普通に半角英数入力とちゃっちゃと切り替えて使うには
f:id:k-kuro:20190421192315p:plain
この英語(US)も足しておく必要がある。(特にmacのUSキーボードで入力しているなら以下の理由によりマストだと思う)

さて、これで漢字変換できるようになったが、英数・かな漢字の切り替えのショートカットがこのままでは使えない(VNC環境で)
というのもMacのUSキーボードにはかな・漢字キーなどがないからね。
入力ソースのオプションというボタンを押すと
f:id:k-kuro:20190421192850p:plain
こんな風に書かれていて、変更を受け付けない状態になっているのだが、このsuperキーってのがMacにはないのね。
なので切り替えようがない。

いろいろ悩んだが、これはMacVNC viewerの側で解決できた。

VNC viewerのPreferenceで
f:id:k-kuro:20190421193244p:plain
このようにLeftCmdKeyをSuper_Lに、LeftOptKeyをAlt_Lに設定してやると良い。
ちなみにデフォルトではLeftCmdKeyがAlt_Lに設定されている。
まあこの辺はWindowsのキーボードのWinキーとAltキーの並び順に従っているのだろうけど、macのoptionキーにはAltと表示されているんだがな。でsuperキーを設定せずに放置しているのってどういうことよ、って思うね。

なおSSHVNCの端末はUSキーボードだからといってlocalectlでキーボードレイアウトをUSにしておく必要はないようだ。localectlでは直接サーバにつないだキーボードの設定を変えるコマンドで、SSHVNCで接続した場合はそれぞれの端末でキーボードレイアウトを読み取って送信しているのだね。


なお、日本語のコピペが文字化けるのは仕様のようで。

サーバのメモリ構成を整理

サーバ   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-2620(6C/12T, 2.00GHz)x2   1333 RDIMM 22GB       192.0GFLOPS
RX200S6  E5630(4C/8T, 2.50GHz)x2    1333 RDIMM 24GB       80.0GFLOPS
RX200S6  E5630(4C/8T, 2.50GHz)x2    1333 UDIMM 4GB       80.0GFLOPS   #バックアップ機
以上クラスタ

RX300S7  E5-2630L(6C/12T, 2.00GHz)   1600 LV-RDIMM 16GB     96.0GFLOPS  GeForce GT 710  #GPU test機

S6世代の使用頻度が下がってきていたので24GBのRDIMM(PC3-10600R)をRX200S7に移し、RX200S7に入れていた16GBのLV-RDIMMをGPU機に。
とりあえずの感じで付いていた4GB UDIMM(PC3-10600E)をRX200S6に入れて、バックアップ機とすることにした。
いっそこのS6はクラスタから外して、CPUも元々付いていたE5603 x1に戻しちゃってNASとして運用しようかな。無駄に電気食いすぎるか?
むしろこのRX200S6にGPUを乗っけてdeep learningに回すのがいいかも。そもそもRX300S7にCPUをもう一個乗っけてしまえば、S62台分をまかなえちゃうのな。クラスタは台数減らしたほうが管理はしやすいのでそのほうがいいかも。



備考
E56xx系統 Nehalem-EP, Westmere-EP のFLOPS/CLOCK は4
E5-26xx系統 Sandy BridgeのFLOPS/CLOCKは8
E3-1230v6系統 Kaby LakeのFLOPS/CLOCKは16