自分のための備忘録的なブログです。

Ubuntu14.04LTS を使って、ディープラーニングの勉強をしています。
記載されているコードは、他の OS には互換性がない可能性があります。


DNN:
マシン性能別 学習速度の比較, TFチュートリアルをmodifyする
python3:
オブジェクト指向プログラミングとは, システムコマンド(os), ファイル・フォルダ名取得, 画像の前処理,
R lang:
R基本コマンド, Rデータ形式, RStudio文字化け(os), RStudio背景黒,
Ubuntu14 の初期設定:
Ubuntu14初期設定, 初期設定-2, cudaなども, 初期設定-3

R基本コマンド

自分のためのコマンドまとめ。

Bash でいう pwd, cd, ls, mv/cp/mkdir/rmなど。

  

基本コマンド

shell でいうところの、cd, ls など

対話的環境が好きなので、Python でも os.path.abspath('.') や os.listdir('.') などよく使います。

まだ調べきれていないのですが、調べた時にメモするページです。。。

 

表記

$ Bash

>R 

  

$ pwd

> getwd()

 

$ cd

> setwd("c:user")

> getwd()

 

$ ls

> list.files() 

 

$ mv (move)

> ?

 

$ mv (rename)

> ?

 

$ cp

> ?

 

$ rm

> ?

  

$ mkdir

> ?

 

$ rmdir

> ?

 

 

 

RStudio 背景を黒くする

Tools

   Global Options

        Appearance

            Editor theme:

                [black theme: 例えば Tomorrow Night など]

 

        -> Apply

 

この方法だと Editor と Console しか黒くならず、 Environment や Files タブのところは白いまま。全体を黒くするには RStudio の Server 版で daily builds というのを使う方法があるらしいが、これは αあるいは βのような位置づけらしい。

qiita.com

記載の通り、コンテナ内など仮想環境の利用なら良いけど、不具合が出る恐れも高い。ダイレクトに試さないほうが善いと思われ。

R データ形式の基本

参考:

http://www.kabipan.com/computer/r/quick.html プログラマ向け?

参考図書:

R による医療統計学, 丸善

RStudioで始める Rプログラミング入門 O'Reilly

 

 

準備

インストール

 afni インストール時に、合わせてインストールされている。

1.1.2. Ubuntu Linux (15.10 and earlier): The essential system setup — AFNI, SUMA and FATCAT: v17.3.09

 RStudio を使うつもりなので、合わせてインストール。

Download RStudio – RStudio

$ sudo dpkg -i filename

でインストールした気が。

 

実践

データ形式

基本のデータ型(type)は6つ。

 double(倍精度浮動小数点数), integer(整数), character(文字), logical(論理値), complex(複素数), raw(バイナリ)

 このうちで頻繁に使うのは、double, character, logical。

 logical は Python でいうところの boolean: true or false. ただし R では、全て大文字の TRUE, FALSE が使われる。

 

 type は 属性 attribute の一種で、typeof( ) 関数でアクセスする。

事前に規定されている属性には、type, mode, class があり、それぞれ typeof( ), mode( ), class( ) 関数でアクセスでる。"double", "numeric" など、 NULL ではない値が割り当てられている。

 names 属性は特殊で関数 names( ) があるが、names 属性は初期値が NULL となっている。

> a <- 1

> typeof(a)

"double"

> a <- "test"

> typeof(a)

"character"

 

プログラミング言語としての R

R はオブジェクト指向プログラミング言語であり、データをオブジェクトとして扱う。

オブジェクト指向プログラミング(OOP)とは

動的プログラミング言語でもあり、実行前にコンパイルは行わない。

 

オブジェクトの最小単位

最小単位は「アトミックオブジェクト」 atomic object

これはアトミックベクタ atomic vector とほぼ同義。違いは分からないけれど。 

 

オブジェクトの生成

 アルファベットや記号を用いてオブジェクトを作成できる。アルファベットの大文字と小文字は区別され、数字や大部分の記号は先頭に来ることはできない。

 記号について、先頭に使うのは他のプログラミング言語と同様、アンスコ(_ アンダースコア)だけとするのがいいと思われ。例えばピリオドは先頭に来ることができるが、特殊な意味を持つらしく、使わない方が良いらしい。

 

 オブジェクトに数値、文字列など、前述の「基本のデータ型」を代入できる。

 

 代入記号は、普通のプログラミング言語の = イコールではなく、 "<-" 左向き矢印。 

 

> a <- 1  ### a というオブジェクトに 数字の 1 を代入する。

> A <- 2  ### A というオブジェクトに 数字の 2 を代入する。

> a

# 1

> A

# 2

> is.atomic(a)  ### オブジェクト a はアトミックオブジェクト。

# TRUE

 

 

一つのオブジェクトに複数データを入力する。

 一つのオブジェクトには、複数のデータを入れることができる。ただしデータ型は統一しなければならない。

 

 複数のデータを挿入するときに頻用されるのが c( ) 関数(construct)。これは複数のデータをまとめたり、python でいう list.append( ) のような機能があったり。

 連続する数値を入力するときには : が便利で、これは python で言う range 関数のようなもの。違うけど。 

 

> c <- c(1, 2, 3) # オブジェクト c に、浮動小数点数 1, 2, 3 を代入する。

> c

# 1 2 3

> typeof(c)

# "double"

> typeof(a) # a <- 1 で作成したオブジェクト a も、浮動小数点数

# "double"

> length(a)

# 1

> length(c)

# 3

 

整数か浮動小数点数か?

 数値を普通に代入すると、多くの場合は浮動小数点数になっている。

 integer にするには、「L を使って明示的に指定する」、「コロン:を使って連続する数値を代入する」などがある。が、普通に使うには、double で問題なさそうであるが・・・

 

> int_a <- 1L # L を使って、数字を明示的に integer にする。

> int_a

# 1

> typeof(int_a)

# "integer"

> mode(int_a)

# "numeric"

> int_b <- c(1:3) # コロンを使った連続する整数の入力

> int_b

# 1 2 3

> typeof(int_b)

# "integer"

> mode(int_b)

# "numeric"

 

文字列の入力

 文字列の入力はシングルクォートまたはダブルクォート 'char' または "char"。

 何かの教科書に ダブルクォート " の方がいいと書いてあった。 ' と ` が紛らわしいから。

 

> d <- "test"

> d

# "test"

> typeof(d)

# "character"

> mode(d)

# "character"

 

R object の様々な型

 R でオブジェクトは "typeof" の他に "mode", "class", "names" などの型がある。 各種の型には、"attribute( )" 関数でアクセスできる。

 (多分) typeof と mode は上書きできない特殊な型だが、他の型は明示的に上書きすることができる様子(後述)。

 

> mode(a)

# "numeric"

> length(a)

# 1

> mode(d)

# "character" 

 

 

vector とは

 "「ベクトル」というのは、たんに(mode と length と names 以外の)属性を持たないオブジェクトということである。"

引用 http://www.kabipan.com/computer/r/quick.html, Accessed: Jan/3/2018

※ すべてのオブジェクトは typeof, mode, length の他に class 属性を持っているので、上記の定義は厳密には間違っているはず・・・ 

 

 一般には 1次元の配列をベクトルと呼ぶ。しかし、R では違うらしい。教科書では比較的最初のほうで「ベクトル」という単語が、定義なしで出てきて、R 初学者を悩ませる。

 さて、R コンソールで、typeof( ), mode( ), class( ) などでオブジェクトを調べても "vector" という用語は出てこない(教科書にはたくさん出てくるのに!)。 おそらく "vector" とは「list( ) などではない、その他のオブジェクト」ということなのでしょう。

 

 これまでに mode と length は出てきた。names とは?

 

属性 "names" の設定

> names(a)

# NULL

> names(a)  <- "test_object"

> names(a)

# "test_object"

> names(a) <- 1

> names(a)

# "1"

> names(a) <- TRUE

> names(a)

# "TRUE"

 

 ということで、オブジェクトの "names" 属性には文字列を挿入することができる。numeric や logical データを挿入しようとしても、character に変換される。

 

atomic object 内の、データ型の変換

 一つのオブジェクトに異なるデータを入れようとすると、データ型は変換される。

 

> e <- c(1, "test")

> e

# "1", "test"

> typeof(e)

# "character"

> mode(e)

# "character"

 

atomic object 内でのデータ変換の規則は

1.文字列型があれば文字列型へ

2.数値型があれば数値型へ

3.論理型のみなら論理型。

 

 

論理型の変換規則

 数値データに変換される場合、TRUE が 1, FALSE が 0。

 文字列型に変換される場合、TRUE は "TRUE", FALSE は "FALSE" へ。 

  ここはトラップな印象。論理型→数値型→文字列型 と順々に変更すると "1", "0" になるのに対し、論理型→文字列型 にダイレクト変換だと "TRUE", "FALSE" になる。

 

文字列 vector, 論理値 vector の作成  

> Prime <- c("Abe", "Trump", "Kim")

> Prime

"Abe" "Trump" "Kim"

> log_vec <- c(T, T, F)   ### TRUE, FALSE は、それぞれ T, F と省略できる。

> log_vec

TRUE, TRUE, FALSE

 

要素の抽出(Python でいう スライス)

> Prime[1]    # 添字は 1からスタートする

# "Abe"

> Prime[2]

# "Trump"

 

> Prime[3]

# "Kim"    ### よしよし。

> Prime[4]

# NA        ### なるほど

> Prime[0]

# character(0)     ### ??

> Prime[-1]

# "Trump", "Kim"    ### えっ?

> Prime[-2]

# "Abe", "Kim"      ### ええええーっ?

 

ブロードキャスト, vector recycling

numpy.array で、各要素一気に計算するブロードキャスト(broadcasting)は、R では標準ライブラリに入っている(vector recycling)。

 

> data_list <- c(1, 2, 3, 4, 5, 6)

> data_list / 2

# 0.5, 1.0, 1.5, 2.0, 2.5, 3.0 

 

> tmp <- c(1, 2)

> data_list / tmp

# 1, 1, 3, 2, 5, 3    ### 1/1, 2/2, 3/1, 4/2, 5/1, 6/2 という風に、要素数が少ないほうがリサイクルされる: vector recycling

 

行列を作る

numpy で言うところの、

>>> a = np.arange(12).reshape( (3, 4)) 

>>> a

array([[ 0, 1, 2, 3],
          [ 4, 5, 6, 7],
          [ 8, 9, 10, 11]])

 

 複数の要素を持つ vector に、属性 dim( ) を与えることで、行列や配列を作ることができる。二次元の属性 dim( ) を持つ配列が行列。

 

> a <- 1:12

> dim(a) <- c(3, 4)

> a

      [,1] [,2] [,3] [,4]
[1,]   1    4    7   10
[2,]   2    5    8   11
[3,]   3    6    9   12

 

Python は数字は 0 からスタート。R で数字は 1 からスタート。

2次元の np.array はデフォルトで行優先で並べる。R は列優先で並べるので、np.array と同じように並べるには

> matrix(1:12,nrow=3,byrow=T)

      [,1] [,2] [,3] [,4]
[1,]   1    2    3    4
[2,]   5    6    7    8
[3,]   9  10  11  12

 

ヘルプの表示は ?function_name

> ?matrix

....

Usage

matrix(data = NA, nrow = 1, ncol = 1, byrow = FALSE,
dimnames = NULL)

....

# なるほど、行か列のどちらか(nrow か ncol)指定すれば、行列のもう一個の方は自動で計算されるのね。

 

行列と配列

R による医療〜 によると、行列とは 2次元の配列っぽい。逆に言えば多次元の行列が配列であると。ちゃんと書いていないけれど、1 次元のデータが vector, 2次元が 行列、多次元が 配列ということか。

 

ファクタ

R による医療〜 より。カテゴリカルデータの保持に有用とのこと。

 

リスト

 リストはアトミックオブジェクトではない

 リストは複数のアトミックオブジェクトやリストを一つのオブジェクトにまとめることができるもの。Python で言うところの・・・なんだろう。Python の tuple とは異なり、ミュータブルである。  

 

> a <- 1

> b <- c("1", "test")

> L <- list(a, b)

> L

1

[1] 1

2

[1] "1", "test"

> typeof(L)

# "list"

> mode(L)

# "list"

 

リスト内の要素へのアクセス

> L1

# 1

> L2

# "1", "test"

> L2[1]

# "1"

 

オブジェクトに属性を与える

> ?attr

....

Usage

attr(x, which, exact = FALSE)
attr(x, which) <- value

....

 

 object x の which という属性(which は文字列)にアクセスして、value という属性を与える。value に NULL で属性を削除できる。

 

> tmp <- 1:12

> tmp

1 2 3 4 5 6 7 8 9 10 11 12

> attr(tmp, "tmp_attr") <- "empty"

> attr(tmp, "tmp_attr")

"empty"

> tmp

1 2 3 4 5 6 7 8 9 10 11 12

attr(tmp, "tmp_attr")

"empty"

 

属性を削除する

> attr(tmp,  "tmp_attr") <- NULL

> attr(tmp, "tmp_attr")

# NULL

> tmp

[1] 1 2 3 4 5 6 7 8 9 10 11 12

 

 

特殊な属性

 前述の通り、 typeof と mode は上書きできない型の様子。

 その他、names( ) と class( ) は標準ライブラリに関数が設定されている特殊な型だが、typeof や mode と異なり、上書きすることができる。

 

> a <- 1:6

> a

1 2 3 4 5 6

> typeof(a)

"integer"

> mode(a)

"numeric"

 

> attr(a, typeof") <- "tmp"

> typeof(a)

"integer"   ### 変更不可

 

> attr(a, "mode") <- "tmp"

> mode(a)

"numeric"  ### 変更不可

 

> class(a)

"integer"

> dim(a) <- c(2, 3)

> class(a)

"matrix"   ### オブジェクトを配列に変換すると、class は "matrix" に。

> attr(a, "class") <- "tmp"

> class(a)

"tmp"

 

> a <- 1:6

> dim(a) <- c(2,3)

> class(a)

"matrix"

> class(a) <- "tmp"   ### attr( ) を使わず、class( ) でもアクセスできる。

> class(a)

"tmp"

 

基本的に、class は自動的に設定された値を使用するべき。

class に基づいてメソッドが呼び出されるため、 class の変更はバグの一因になりうる。

ただし、自分で 明示的にオブジェクトを作成する場合には、適切な処理を行うために class を明示的に指定する必要があるかもしれない。

 

名前属性 names( )

 名前属性は特殊な attribute で、この属性を持っていても vector でいることができる。基本的には > attr(tmp, "names") でアクセスするが、> names(tmp) でもアクセスすることができる

 

 

Python + NiBabel で nii ファイルを扱う

NiBabel は、神経画像のフォーマットである Analyze, NifTi などを扱うことができる Python ライブラリ。

Neuroimaging in Python — NiBabel 2.2.1 documentation

このページに書いてあるのは上記リンク先の超訳(抄訳+個人の感想)なので、詳しくはリンク先を読んでいただきたし。

  NifTi とはなんぞや -> こちら参照。nifti ファイルを python で。

 

NiBabel は Analyze, GifTi, NifTi, NINC1, MINC2, MGH, PAR/REC など多彩なファイル形式を扱うことができるということ。このライブラリ自体は PyNifTi の後継とのことなので、もとが「NifTi を Python で扱いたい」というところから来ているものと思われる(個人の妄想です)。

 

NiBabel は各種データの I/O (in-out)に使用し、解析には numpy, scikit-learn, tensorflow など別のライブラリを用いる。Jupyter Notebook で R に投げたりもできるだろう(やったことないけど)。

 

 

事前準備

 インストール

$ pip install nibabel

 

インポート

>>> import numpy as np

>>> import nibabel as nib

 

(画像を読み込むと numpy array 形式となるので、numpy もインポートしておく)

Python 3.6 でエラーが出たので、現状 3.5 以前で使うのがベター。当然 pyenv や conda仮想環境を使うべき)

 

データ形式と "RAS+"

2つのデータ形式

NifTi には NifTi-1 と NifTi-2 の 2つのデータ形式がある(が拡張子は一緒!!ややこしい!!)。

 

詳しくないかざっくりと解説

nifti ファイルを python で。 - 医用画像で Deep Learning

RAS+ と 4つの次元 

NifTi 形式には 4つの次元がある: xyzt

 空間方向の 3軸(xyz)と、時間方向(t)の 1軸

空間座標は基本的に RAS+ だが、それ以外の形式で保存されていることもあり注意が必要。RAS+とは、第1軸(x軸)は 左から右(right)へ、第2軸(y軸)は後ろから前(anterior)へ、第3軸は下から上(superior)へ、という形でデータが並んでいるということ。

 RAS+ が被験者の上側から眺めたような配置。医者が CT や MRI を見るときの配置は、LAS に相当。

 

コードを触ってみる

参考:

NiBabel 2.2.1 General tutorials

NiBabel 2.2.1 getting started

 

画像の読み込み

img_file = nib.load('ファイル名')

img = img_file.get_data()

 nib.load() で読み込んでも、画像データは自体はキャッシュ/メモリーに取り込まれない。メモリー節約のために、「画像がここにありますよ」という位置情報だけを読み込んでいると思われ。

 get_data() メソッドで画像データを読み込む(原文では cache に保存する、と書かれているが、実際は RAM なのかな)。この読み込んだ画像データを、nibabel では  proxy と言うらしい: Neuroimaging in Python — NiBabel 2.2.1 documentation

proxy: 代理、代理人、代用品

 ここで >>> type(img) に対して <... 'numpy.ndarray'> と返るらしく、np.array 形式で読み込まれる。

 

画像のオリエンテーションを確認する

nib.aff2axcodes(img.affine)

 ここで ('R', 'A', 'S') と返るならば RAS+ 形式。

 

画像を読み込んだかどうかを確認する

img.in_memory

 画像データが読み込まれている(chache に読み込まれている, proxy)なら True が返る。

 

画像データを消去する

img.uncache()

 

ヘッダーの取得と表示

hdr = img.header

print(hdr)

hdr.get_xyzt_units()

 ヘッダーの get_xyzt_units() メソッドで、単位を取得できる。返り値はタプルで、('mm', 'sec') など。

 

データ形式の確認

img.get_data_dtype() == np.dtype(np.int16)

 返り値は True または False。確認方法めんどくさいな・・・

 チュートリアル(getting started)の nii ファイルは np.int16 で保存されていた。int16 だと -32,768 から 32,767 の範囲とのこと、CT も MRI もこの形式で大丈夫(カバーできる)だろう。

 これよりデータ量を減らそうとすると、uint8 でも 0-255 までしか保存できない。uint8 で保存すると画質が劣化するはず、jpg とか png とか、基本 uint8 のはずですが。

 

数値の取得

x_len, y_len, z_len = img.shape

x = x_len//2

y = y_len//2

z = z_len//2

value = img[x, y, z]

print(value)

 画像データを読み込んだ後は、python 標準ライブラリでスライスして、数値データを表示したり、計算したり、代入したり、好きに扱うことができる。

 ここまで来ればあとはご自由に、と言った感じ。

 

画像の表示

import matplotlib.pyplot as plt

 

slice0 = img[x, :, :]

slice1 = img[:, y, :]

slice2 = img[:, :, z]

 

def show_slices(slices):

    fig, axes = plt.subplots(1, len(slices))

    for i, slice in enumerate(slices):

        axes[i].imshow(slice.T, cmap="gray", origin="lower")

 

show_slices([slice0, slice1, slice2])

 画像は四次元データなのだけど、もし時間方向にデータがひとつしかない場合、numpy の機能で三次元になっているはず。上記は、その三次元で読み込まれた場合のスクリプト

 もし四次元で読み込まれた場合には

>>> img = img[:, :, :, 0]

 の様に、三次元データにスライスしてから上記コードを実行すればいい、はず。

 

アフィン変換

tutorial には、アフィン変換について延々と書いてある。

Neuroimaging in Python — NiBabel 2.2.1 docum entation

画像を拡大・回転・平行移動(アフィン変換)することでボクセルの位置を変更することが可能、異なる画像の座標を変更して、位置合わせができるということ。

この部分、数学的に大変なので扱わず・・・

 

それぞれの NifTi ファイルには撮影スライスの位置や傾き、拡大率を表す「アフィン」"affine" の値が設定されている様子。

>>> img.affine

で確認でき、画像データと affine とで計算することで位置情報を修正できるらしい。が、工学部卒ならともかく、私の理解は超える。。。

 

画像データの変更

print(img[0, 0, 0, 0])

img[0, 0, 0, 0] = -99

print(img[0, 0, 0, 0]

 

画像の保存

nib.save(img, 'new_file.nii')

# もしくは メソッドとして

img.to_filename('new_file.nii')

 

 以上!

nifti ファイルを python で。

nifti ファイルを取り扱った経験が少なく、誤りに気づかれた場合、お教えください。

どうぞよろしくお願いいたします。

 

 

NifTi

概要

NifTi は神経画像解析に係るフォーマット。

Neuroimaging Informatics Technology Initiative の abbreviation

NIFTI - What does NIFTI stand for? The Free Dictionary

NifTi-1  NifTi-2 の 2種類の形式がある。

4次元の情報を入力可能: xyzt

 空間の 3次元(xyz, 基本は mm)

 時間軸方向の 1次元(t, 基本は msec)

 

拡張子

拡張子は .nii

.gz 形式で圧縮され、 .nii.gz という拡張子のことも。

 

NifTi-1, -2 の違い

参考:The NIFTI-2 file format | Brainder.

要点

NifTi-2 は NifTi-1 を拡張したもの。医療用画像データの肥大化に対応したらしい。

 

ポイントは

収納できるデータ量の増加

NifTi-1 ではひとつの次元に 2バイトしか情報を入れられず、2 ** 15 - 1 = 約 33万ボクセルしか扱えなかったとのこと。NifTi-2 では 8 byte の情報を扱えるようになり、2 ** 63 -。1 = 約 9 x 10の 18乗 のボクセルを扱える。

現在は 256 ** 3 くらいの画像を使うことある。これは 約 1700 万ボクセル。確かに NifTi-1 フォーマットでは扱えない。一方で、NifTi-2 フォーマットにはずいぶんと余裕があることもわかる。

 

ところで NifTi-1 ではどの程度の解像度で画像を扱えるのか? 256 x 192 x 20 (2D撮影で、解像度低めの撮影条件)でも 100万ボクセル近く、NifTi-1 フォーマットの上限を超えてしまう。NifTi-1 フォーマットでは画像は圧縮して扱うのが基本なのかもしれない。

 

区別

NifTi-1 形式のヘッダー情報は 348 (bit?)、NifTi-2 形式のヘッダー情報は 540 (bit?)とのこと。ヘッダーの大きさで区別することができる。

 

 

 

NiBabel

概要

神経画像を Python で扱うためのライブラリ。

ホーム

Neuroimaging in Python — NiBabel 2.2.1 documentation

コードは GitHub にて公開されている。

GitHub - nipy/nibabel: Python package to access a cacophony of neuro-imaging file formats

ライセンス

基本的には MIT ライセンス。一部 BSD ライセンス。

Neuroimaging in Python — NiBabel 2.2.1 documentation

 

PyNifti という過去のプロジェクトを引き継いだもの。 

PyPI で管理されており、pip で簡単インストール可能。

 

インストール

$ pip install nibabal

 

2017年末時点で、一部コードは Python 3.6 対応していないようです。Python あるあるですが、pyenv, conda などでの管理がベター。

 

使い方

別ページ参照 

Python + NiBabel で nii ファイルを扱う - 医用画像で Deep Learning

 

サポート

メーリングリストにて質問する形。

メールアドレスは

Neuroimaging in Python — NiBabel 2.2.1 documentation

参照。

拡張性を考えてディープラーニング用パソコンを組むとき

拡張性重視で組む時 重視したいポイント。

ネットや書籍で見なかった意見を中心に。

   

 

必要なパーツ 

ケース

E-ATXマザーボード対応

 パソコンパーツを設置する板、マザーボードのサイズは様々。小さな mini-ITX から、micro-ATX, ATX, Extended-ATX (E-ATX)など。大きなボードほど、たくさんのパーツを設置でき、拡張性も高い傾向。

  拡張性重視なら、大きな E-ATX を載せられるケースがベター。ATX も拡張性が高いモデルが多く、E-ATX または ATXマザーボードを選びたい。mini-ITXmicro-ATX は拡張性が劣っている。

静音ケース

 ディープラーニングではパソコンが長時間フル稼働になる。ノイズに配慮した「静音」ケースがベター。

 パソコンの騒音は、主に冷却の「ファン」に由来。「静音」ケースは 1)音漏れを防ぐために開口部が少なく、2)内部に消音材が設置されて、3)ファンコントローラーによってファンノイズをコントロールできる。

長尺電源対応(22.5cmの電源が入ること)

 電源容量が大きい物ほどたくさんのパーツを動かせるけれど、より長い(長尺)傾向がある。長尺電源対応のケースを選びたいところ。

 

 コンセント一本あたりの電流は 15A まで。日本は 電圧 100V なので、電源の最大サイズは 1500W 。

 1500W クラスで各社の電源を見ると、22.5cm のが多い。ただしSilverStone 社が 18cm で 1500W 対応の電源を出している(SST-ST1500-GS/TI)ので、18cm あれば 1500W 電源を設置可能。

 

 18cm が入れば十分とも言えるが、できればいろいろなメーカーの 1500W 電源が選べるよう、22.5 cm 電源対応を選びたい。

水冷対応・五インチベイなし・HDDが分離配置。

 ディープラーニングでは激しく発熱するので、冷却性能が高い「簡易水冷」を選べるケースがベター。

 水冷には 2種類の方法があり、自分で組み立てる「本格水冷」と、ワンセットになった「簡易水冷」。本格水冷は大変なので、初心者はやらない方が言い(本格水冷できる人は、こんなブログ記事を読まずにパーツを剪定しちゃうはず。。。これを読んでる時点で簡易水冷の方が(ry)。

 

 5インチベイは、かつては CD-ROM や DVD-ROM を読み込むために必須だった。5インチベイがあると、「フロント上部」という、簡易水冷を取り付ける「おいしい」ポイントが潰れてしまう。

 

 HDD はフロントの下部に設置することが多いのだけれど、これも 5インチベイ同様、水冷と干渉してしまう。最近では HDD が水冷に干渉しないように分離して配置するケースも増えてきた。

拡張スロット八本(以上)

 ディープラーニングでは GPU を使い、計算を高速化できる。このために「拡張スロット」に GPU を設置するが、一台の GPU を設置すると、二本の拡張スロットが必要になる。そして、一台のマザーボードに は4台までの GPU を設置できる(のが一般的な)ので、4台 x 2スロット = 8本以上の拡張スロットが欲しい。

 

 しかし、GPU 増やすと他のパーツもアップグレードが必要となってくるので、金銭的に大変になる。GPU をたくさん挿さない選択肢もあるが、一度 2本挿しの速さを経験してしまうと、たくさん挿したくなってしまう。

 

結局どれを買うの?

 ケースは安いほうがいい。

 一万円程度の予算で調べ、上記すべてを満たすのは見つからなかった。

 いくつか条件を満たすケースは

 

Antec P110 (長尺電源20cm, EATX対応なし)

Corsair Carbide 600q (長尺電源が 20 cm まで。倒立ケース、1万円超え)

Corsair Carbide 400q (電源 18cm, 拡張スロット 7本)

Corsair Carbide 270R (電源 22.5cm, EATX対応なし、スロット7本)

Fractal Design Define R5 (EATX対応なし、拡張スロット7本、5インチスロットあるが取り外し可能)

Fractal Design Define S(EATX対応なし、拡張スロット7本)

 

 など。ケースは新しいモデルが随時発表されているし、今調べたら他にもあるかも。

 

 条件を十分満たすケースは「でかく」「高く」「重く」なるので、お財布とよく相談。

 

電源

1000 ~ 1500W対応

 ディープラーニングでは大量の電力を消費するため、家庭用コンセントの上限(15A x 100v = 1500W)である 1500W の電源を選択したい。しかし内部のロスがあるため、定格 1500W でも、使えるのは 1200 ~ 1350 W 程度 (1500 * 0.8 ~ 0.9) 。

 

 パソコンの最大消費電力と、この電源のワット(W)数を超えてしまうと、動作が不安定になるので、事前に調べておく必要がある。

 パソコンの最大消費電力は大体

   (CPU の TDP)× 2 + (GPUTDP

 になるらしい。

 

 例えば、 20 万円くらいで CPU/GPUcore i5, GeForce GTX 1070 x 2 台で組むとする。消費電力は

core i5TDP 90W) + GeForce 1070 x2 (TDP 150W x 2)

 で、

90 x 2 + 150 x 2 = 480 W

 

 この場合、最低必要な電源容量は 480 / 0.8 = 600W

 ところで、電源ユニットのロスが最も少なくなるのは負荷が 50 % 程度の時だそう。電力ロスを少なくしたいなら、 480 / 0.5 = 960 W の電源になる。

 ここからスペック上げていくと、消費電力は上がっていく。

 

 たとえば 6800K + 1080ti x 2 なら

(140 x2 + 250 x2) / 0.8 = 975 W が最低限必要。

 1080ti を 3本にして、6800K + 1080ti x3 なら 1287.5 W 。1080ti を 4本にして 6800K + 1080ti x4 なら 1600 W と 1500W を超えてしまう。GPU 4本挿しなら 6800K + 1080ti x3 + 1070 (1475W)または 6800K + 1080ti x2 + 1070 x2(1350 W)が現実的だろう。

 マルチスレッド性能の高い AMD Ryzen ThreadRipper も魅力的だけれど、6800K など high-end intel CPU に比べて消費電力が多い(TDP 180Wで、6800K に比べて 50W 大きな電源ユニットが必要になる)ため、その分、GPU 性能を抑える必要が出てくる。

 

 さておき、少なくとも 1000W くらいの電源は買っておきたい。はじめから最大の 1500W を買えば、後々買い替えの必要は出てこない。

できればフルモジュラー

 モジュラー電源とは、パソコンパーツに電源を供給するケーブルを付け外しできる電源。全てのケーブルを取り外せる「フルモジュラー」と、一部が取り外せない「セミモジュラー」がある

 ディープラーニング用パソコンはパーツが多くなりがち。組み立てやすさ、ケース内換気とか考えると、ケーブルを外せる「モジュラー」電源がいい。

出力側ケーブルの本数

 購入前に電源ユニット出力の確認が大事!

 拡張性重視なら CPU の 4+4 ケーブルが 2本、GPU 用の PCIE ケーブルが 8本欲しい。「ケーブル足りず起動しません」なんて目も当てられない。

 

 例えば前述の、シルバーストーン社から出ているコンパクトな 1500W 電源(SST-1500-ti/gs)には、高価な 「チタン(ti)」モデルと割安の「ゴールド(gs)」モデルがある。「ゴールド」は 1500W の大出力なのに、何故か PCIE の出力が少ないので、拡張性は低い。

 

マザーボード

 4-way SLI 対応

  ディープラーニングGPU で高速化できる。GPU をたくさん使えば、更に高速化が可能なので、GPU をなるべくたくさん挿せるマザーボードを選びたい。GPU を挿せる数はマザーボードにより様々で、一般に 1 から 4 本になる。

 SLI とは、複数の GPU を同期して動作させる規格。SLI を利用することでディープラーニングを高速化できるので、拡張性重視なら、SLI の最上位規格である 4-way SLI 対応を選びたい・・・多分使うことはないだろうけど。

 それでもなぜ 4-way SLI のボードにしたいかというと、拡張スロット 8本のケースで確実に GPU 4本挿せるし、拡張スロット 7本でも 3本挿せるから。初心者のうちはマザーボードを見ても、何本の GPU が挿せるかなんて分からない(自分は分からなかった)けど、○○way SLI と書いてあれば、○○の数だけ GPU を挿せることが分かる。

 一方、3-way SLI 対応のマザーボードには注意が必要! 拡張スロットとの兼ね合いで 2本までしか刺せない場合もある(それでも、確実に 2本は挿せる)。そして 2-way SLI 対応のマザーボードなら(2-way SLI は、2-way が略されて「SLI」とだけ書かれていることも多い)、2本の GPU を挿すことができる。

 

 ただし繰り返しだけれど、GPU を増やすと、その他のパーツも高性能・大容量にアップグレードしていく必要が出てくるのが辛い。

 また、実際に GPU を 4本挿すと、ケース内がキツキツになってしまい、整備がとても大変になる。4本挿しは整備が大変なので、GPU は 2本に限定した方が楽ではある。

wifi, bluetooth 付き

 wifibluetooth は必須の機能ではないが、あると便利。

 

 ただし、Linux OS を使う場合、wifibluetooth のドライバがなくて、動かない場合がある。この機能はそんなにこだわる必要ないと思われ。ただしあると便利。

x99, x299, x399など、RAM 128 GB 対応

 ディープラーニングでは大量のデータを扱うため、パソコン本体の RAM も多いほうがいい。個人のパソコンなら 128GB が上限だろう。それ以上の製品はほとんど売っていないし。

80mm m.2 NVMe スロットが 2本以上 

 ディープラーニングでは大量のデータ読み込み・書き込みが発生し、大量のストレージが必要。現在一般的なストレージのうちで最も速い m.2 NVMe SSD を複数使えるとありがたい。

 実際は一本で良いけど、拡張性を考えると 2本欲しい。1本だけだと足りなくなった時「買い替え」になるけど、複数本あれば「追加」可能なので。

 

 ちなみに現状、チップセットとの絡みでは、

x99: 1本

x299: 2本

x399: 3本

 の製品が多いみたい。

Thunderbolt 3 ポート

 最近、外付け GPU (eGPU)が出てきた。Thunderbolt 3 ポートで接続する。 eGPU は他のパソコンと使い回しできるし、今後のトレンドになるかも。

 

ストレージ

500GB 以上の m.2 NVMe SSD

 ディープラーニングではデータがメモリーを溢れだし、「Swap」を用いる場合がある。Swap 用に高速なストレージを大量に用意したい(自分は Swap に100GB 以上割り当ててる)。

 m.2 NVMe SSD は、今のところ 256-512 GB 程度の製品が割安。500GB が狙い目だと思う。

 

GPU

メモリ量と価格のバランス

 GPU で重視すべきはメモリ(Video RAM, VRAM)量。GPU で計算を行う前に、はじめにデータを VRAM に載せる。データが VRAM に載りきらなかった場合、パソコンのメモリ (RAM) を使って計算する。RAM は VRAM と比べてざっくり10倍遅いため、学習速度も遅くなる。

メモリの種類と速度について表にしてみた【2016秋】 - Qiita

 なるべくたくさんのデータを VRAM に載せられるよう、VRAM 多いモデルを選びたい。 VRAM の大きな GPU

GeForce 1080 ti, VRAM 11GB, 実売 10万円程度

GeForce 1070, VRAM 8GB, 実売 5万円程度

 もちろん 1080ti がいいのだけど、バカみたいに高いので、半額で 2/3 の VRAM を確保できる 1070 も魅力的。

 

 RAM にも載り切らない場合、ストレージの「スワップ」を使用する。スワップはざっくり、RAM の 10 倍以上遅い

プログラマが知っておくべき、メモリ/ディスク/ネットワークの速度まとめ - Qiita

 のだが、GPU も RAM も高いので、「スワップを使う」と諦める(安い GPU を使い、RAM の量も少量に留める)のもありだと思う。 

 

ディスプレイ 

デルの28インチくらいがほしい

 パソコン組み立てには関係ないのだけど、いいディスプレイも仕事に必須。

 

 「デル」と書いたのは、これまで使ったデルのディスプレは機能豊富で使いやすかったから。

 

 具体的には

 1.複数系統の入力

  HDMI, DVI-D, DP, VGA など

 2.高さ調節

 3.マウント部にケーブルホール

  ケーブルがバラバラになるのを防ぐ孔

 4.USB

  ディスプレイ自体が USB ハブ機能を持ってて便利。

 

おわり。

思いついたら追加するかも。 

 

 

 

今回見つけたサイト。

http://timdettmers.com/2015/03/09/deep-learning-hardware-guide/

英語ですが、「CPU はどのようにデータを扱うのか」と言った基本的なことから記載されており、大変参考になります。

ヒストグラム比較に使ったコード

うろ覚え

 

 

 

 

import numpy as np
import matplotlib.pyplot as plt
import argparse

 

parser= argparse.ArgumentParser()
parser.add_argument("-infile", nargs = 1)

 

try:
    decoded = args.infile[0]
except:
    decoded = "保存ファイル.npy"

 

a = numpy.load(decoded)
b = numpy.load("ほにゃらら.npy")

 

a = np.reshape(a, [a.shape[0] * a.shape[1] * a.shape[2])
b = np.reshape(b, [b.shape[0] * b.shape[1] * b.shape[2])

 

fig = plt.figure()
ax = fig.add_subplot(1,1,1)
ax.hist(a, bins=256, normed=True, color='red', alpha=0.5)
ax.hist(b, bins=256, normed=True, color='gray',alpha=0.5)
fig.savefig("1.png")

# 表示して見て確認したいなら fig.show()


fig = plt.figure()
ax = fig.add_subplot(1,1,1)
ax.hist(a, bins=256, normed=True, color='red', alpha=0.5)
ax.hist(b, bins=256, normed=True, color='gray',alpha=0.5)
ax.set_xlim(0, 80)
ax.set_ylim(0, 0.1)
fig.show("2.png")


fig = plt.figure()
ax = fig.add_subplot(1,1,1)
ax.hist(a, bins=256, normed=True, color='red', alpha=0.5)
ax.hist(b, bins=256, normed=True, color='gray',alpha=0.5)
ax.set_xlim(40, 200)
ax.set_ylim(0, 0.02)
fig.show("3.png")

 

参考

qiita.com

 

 

python xxx.py -infile yyy

 

見たいにファイル名を指定して実行できる。

はずだけど、できなかった。。。

 

精進が足りない。。。

 

対話的に使えばファイル名を指定できるから、まぁいいや。

labeling_for_object_detection の使い方

faster R-CNN, YOLO, SSD 等で用いる、学習データの生成ツール?  labeling_for_object_detection

 

セットアップに苦労しました。

ので、まとめておきます。

 

コードはこちら

github.com

 

セットアップの際に参考にしたサイトです。

ほとんど、このサイトの記載通りですが、少し違います。

ai-coordinator.jp

 

・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・

 

 

A. ソフトのインストールと起動

0. 環境

 Ubuntu 14.04 および、Windows 10

 1. Processing のダウンロード 以外はほぼ同じ。

 

1. Processing のダウンロード・インストール

 Processing というソフトをダウンロードします。

Download \ Processing.org

 

 32-bit, 64-bit は自分の OS に合わせて。普通は 64-bit を使っているはず。

 わからなければ 32-bit をダウンロードすれば、どちらでも動くとは思いますが・・・

 

 labeling_for... コードの対応は Processing 3.3 となっています。

 しかし、現在はダウンロードページから 3.3 をダウンロードできません。

 現時点では Processing 3.3.5, および, 3.3.6 にしかアクセスできませんが、3.3.5, 3.3.6 でも動きました。

 

 Windows でしたら、 .exe を使ってインストール。

  ウィザードで簡単にインストールできます。

スタートメニューには登録されません。

デスクトップに生成されたショートカットをダブルクリックして起動。

ショートカットは邪魔なので、生成されたフォルダ "processing-3.3.x" に移動しました。また、 "processing-3.3.x" フォルダも、邪魔にならない適当な場所に移動しておきます。

 

 Ubuntu 14 でしたら、

ダウンロードしたファイルを unzip で展開

ターミナルで展開されたフォルダ内に移動、

bash install.sh

にてインストールします。

 

デスクトップ上にショートカットが生成されます。私はわかりやすいように、展開されたフォルダ "processing-3.3.x" に移動しました。また、 "processing-3.3.x" ディレクトリ自体も適当な場所に移動しておきます。私は /home におきました。

 

ダウンロードしてきた processing-3.3.x.zip はあとは不要なので、

rm

するなり、保存フォルダに置いておくなり。

 

私の場合は、将来の再インストールに備えて、NAS に保存しておきます。  

   

 

 

2. github から コードをダウンロード

# terminal

cd

git clone https://github.com/slowsingle/labeling_for_object_detection

 

※私は /home にダウンロードしました。

 お好みで、お好きな場所に

 

 

3. Processing を起動、設定

1. Processing を起動します。(ショートカットのダブルクリック)

 

2. 「labeling_for_object_detection」内のファイル移動

labeling_for_object_detection 内に mainGUI ディレクトリーを作成。

すべてのファイル・ディレクトリをこの中に入れます。

cd labeling_for_object_detection

mkdir mainGUI

mv *.pde mainGUI

mv xml mainGUI

 

2. Processing で、 mainGUI.pde を開く、「フォルダ」「開く(Ctrl + O)」から、

メニュー「フォルダ」「開く(Ctrl + O)」から

「labeling_for_object_detection/mainGUI.pde」を開きます。

 

3. labeling_for_object_detection の起動

「labeling_for_object_detection/mainGUI」ディレクトリ内の mainGUI.pde をダブルクリック。

processing が起動します。

processing ウィンドウの左上の三角ボタン(再生ボタン)を押すと、使用可能状態になるはず。

 

 

 

B. コードの修正 と ラベル付け

コードの修正: mainGUI.pde

このプログラミング言語は使ったことがなので

間違ってたら申し訳ない。java なのかな。

1種類のみのラベル, lesion を使う方針。

 

コードの修正前に、mainGUI.pde はどこかにコピーしておいて、バックアップしておくのが吉。私の場合は

mkdir backup

cp mainGUI.pde ./backup

のように保存。

 

line 10

final int N_CLASS = 1;


line 12

final String[] index2name = {"lesion"};

 

line 51-54 コメントアウト

/* radio.addItem(index2name[1], 2);
radio.addItem(index2name[2], 3);
radio.addItem(index2name[3], 4);
radio.addItem(index2name[4], 5); */

 

ラベルする

このソフトでは、画像を表示する領域の広さは 600x600程度

このため、対象画像も 512x512 程度以下のピクセルに縮小しておいたほうが無難。

 

1. processing の起動

 mainGUI.pde のダブルクリックで開くのが楽。

 左上の参画じるしをクリックすると、ラベルするためのウィンドウが開く。

2. ファイルを開く

 右上の LOAD IMAGE ボタンより

3. ラベルする

 ラベルしたい名前のボタン(Chiyo, Cocoa など)をクリックしたあとで、ラベルしたい場所の「左上と右下」、または「右上と左下」をクリック。赤い四角で囲まれるはず。

 場所が良ければ SAVE RECT をクリックして保存する(赤い四角は消えるはず)

 ラベルしたい場所が他にもあれば、3. を繰り返す。

4. 保存

 OUTPUT XML ボタンを押すと、同一ファイル名(拡張子が.xmlに変わったもの)が、/labeling_for_object_detection ディレクトリ内に保存される。

 ひとしきり保存が終わったら、

mkdir xml_data

mv *.xml xml_data

 などで全部移動してしまうこと。

 5. DELETE RECT ボタン

 現在書きかけの赤い四角を消去する。

 SAVE RECT を押し、保存しておいた赤い四角は消えないので注意 

 

 

ディープラーニング用GPUの選択 - 2017版

ディープラーニングを行うのに、GPU があると、すごく高速になります(GPUコンピューティング)。 GPU コンピューティングをするのに、「CUDA」というソフトを使うことが多いです。

 

CUDA :NVIDIA 社の GPU を,計算で使うためにプログラム

CUDA - Wikipedia

 

CUDA に対応した GPU を探すと

developer.nvidia.com

TESLA、QuadroGeForceNVS といろいろな製品があります。

どれを選べばいいのか?

 

店頭で売ってるのは GeForce ばかり。

ディープラーニングのブログを見ても、使われているのはほとんどが GeForce 。値段を考えても、個人で試すなら GeForce の一択でしょう。TESLA, Quadro は高いです。NVS は見たことがないです。

上記サイトでは性能を表す Compute Capability (CC) という数字があり、これは新しいモデルほど高いです。CC が高いと新バージョンの CUDA に対応しているようで、基本的には最新モデルを買う(CC高いのを買う)ことになります。

 

現在の最新モデルというのは、GeForce GTX なら 1050, 1050ti, 1060, 1070, 1070ti, 1080, 1080ti という型番号になります。番号が大きいほど値段が高く高性能、ti が付いている方が高性能です。

(なお、こういったエレクトロニクス製品では「不具合を避けるために最新モデルを買わない」というアプローチもあります。実際、前の世代の GeForce900系では、「RAM 4GB のうち 3GB しか使えない」、というトラブルありました。ただし現行モデルである GeForce 1000系が出てから 1年以上経ち、特に不具合は聞いていませんし、最新モデルを買って大丈夫だと思います)

 

高性能なモデルほど高いので、後はお財布と相談してモデルを選ぶことになるでしょう。

 

お財布に合うことは重要で、ディープラーニングの教科書でも、

shop.ohmsha.co.jp

 

GeForce GTX 750 という旧機種を導入して、高速化しています。教科書を書くような先生でも旧機種ですから、普通の人だって安いので十分のはず・・・いや、知識がないからこそ札束で殴ったほうがいいのかもしれない・・・財布と相談です。

 

もし医療用画像(データ量が多い)でディープラーニングするなら、メモリー大きい方が良いです。価格あたりのメモリーが多いのは 1050ti(4GB), 1060(6GB), 1070(8GB), 1080ti(11GB) 、ここから選ぶことになるでしょう。

 

GPU は様々な会社が出しており、様々な製品があります。

いくつか気になるモデルをあげます。

 

まず、1050ti はロープロファイル(小さい)モデルがあります。小さいものを買えば、コンパクトな PC ケースにも入ります。こういう小さいモデル

www.ask-corp.jp

 

をコンパクトケースに入れるとか

apac.coolermaster.com

 

コンパクトですと、置き場にも、持ち運びにも困りません。

値段も安めで、5万円程度でパソコンを組めると思います。

それで GPU なしのノートパソコンよりずっと速いはず。

 

高性能な GPU を買うなら、1080ti の簡易水冷モデルが良いでしょうね。

kakaku.com

高いです。。。

 

ディープラーニングすると、CPU, GPU が非常に熱を持ちます。次のに書いていますが、

pmonty.hatenablog.com

私の場合で、CPU は 80度、GPU は 85度まで行きました。

 

ディープラーニング中、GPUは本当に熱くなります。

1080 や 1080ti といった高価なモデルを買うなら、部品の故障を防ぐために簡易水冷モデルを買いたいところです。。。高いですけど。

 

 

安い時に買う方法として、

Google Chrome には Amazon の過去の値動きをグラフ化してくれる「Keepa」というアドインがあり、参考になります。ただし、もしこれから研究でディープラーニング使用としている人なら、多少高くても値段には目をつぶったほうがいいと思います:安い時を狙って買う機会を逸すると、肝心の研究時間がなくなってしまいますからね。

chrome.google.com

 

憧れの NAS と現実

憧れの NAS を買いました。

Synology の 216j.

2ドライブの入門機です。

 

www.synology.com

 

数ヶ月運用したので感想。

 

まず、購入した目的は、複数 PC でのデータ共有でした。

 

これまで、複数 PC でのデータ共有は、

Dropbox の無料容量で頑張ってきました。

 

PC母艦は家に置いてあります。

外でノートでちゃっちゃとコード書いたり、処理を試すこともあり。

 

データのやりとりが必要。

で、メインで使ってる Dropbox では足りなくなってきたと。

 

Onedrive や GoogleDrive を併用しても良かったのですが、

それほど容量が増えるわけではないし。

 

複数のソフトを常駐させると、

  遅くなったり、

  消費電力が増えたり

しそうだから嫌。

 

OneDrive は Ubuntu で使えないし(使い方が分からない)。

 

MicrosoftGoogle は、Dropbox と比べ、

プライバシーに不安もありました。

 

アップルはテロリスト(疑い)の個人情報を守りましたし、

アップルなら信頼しますけど。

 

一部の企業は、サービス最適化のため、

顧客データで機械学習とか回してるでしょうしね。

 

ディープラーニングは「研究」でやってるんで、

虎の子の「データ」を、企業に渡すわけにはいかんのです。

 

で、クラウド上でデータやりとりするために、

憧れの NAS を導入しました。

 

(ホントにデータを守りたければ、クラウドなんか使っちゃダメで、

全部ローカルで管理しなきゃなんですけどね。)

 

 

RAID で冗長性確保。

データをロスする危険も減ってウハウハ!!

 

 

かと思っていたら!!

 

まず、Dropbox の様に使おうと思い、Synology-Cloud-Station-Drive と言うソフトを各 PC に導入、常時同期をやっていました。するといくつか問題が。。。

 

問題点

1.遅い

 LAN ケーブル1本、RAID 1 ですから、書き込みがめっちゃ遅い。

 しかも複数の PC で常時同期してるので、遅い、遅い。

 

2.時々同期されなかったり。

 いつまで待っても同期されなかったり。

 PC再起動、NAS再起動したりして、なんとか同期してくれました。

 

 けど、まぁ不安ですわね。

 「データを保存してるつもり」で「保存されてないかもしれない」訳ですから!

 

 

で、Dropbox って本当に優秀なんだと、今更気付きました。

高速

複数 PC からも常時同期。

世代管理で以前のファイルを復活

 など

 

良いんですけど、おかげさまでお値段も良い訳です。

当然ですね。

1TB で月々1000円という。

navi.dropbox.jp

1TB っていうのは、ちょっと少ないですね。

日常的に使う分なら十分ですけど、ビッグデータとなると足りないですね。

悩ましい。。。 

 

 

ビジネスのスタンダードとか言うサービスなら、2TB あるいはそれ以上使えるんですけど、「5名様から」なので、お値段は75ドル/月からですか。高いですね。

Dropbox plan comparison - Dropbox Business

 

 

 

でも、Dropbox の 1TB 有料プランって、本当に高いのでしょうか?

今回の NAS 導入費用はざっくり 4万円, で 3TB です。

4万円あれば Dropbox 1TB のでも 3年以上使えますね。

 

でも目的は、ディープラーニングビッグデータ管理。

1TB では足りません。

 

 

 

で、札束で殴って、

NAS を高速化することを考えてみます。

 

 

ボトルネック

データの入出力の LAN ケーブル

データ書き込みの HDD

なので、これらを複数帯域確保すれば、速くなるでしょう、と。

 

 

実際の RAID の速度比較 については

こちらのサイトを参照。

https://hikaku.cman.jp/raid/

 

 

例えば 5本差しの RAID 6

  (5本のうち2本が壊れても大丈夫)

  ざっと2-3倍に高速化するようです。

 

 

Synology は 5本モデルからは LAN の差し込み口が4本。

  LAN を複数挿せますし、

  PC とダイレクト接続もできますね。

  ルーターを介さず、ダイレクトの方が速いんでしょう。

 

 

しかしまあ、5本差しモデルというと、本体 10万円くらいになっちゃうし。

HDD も 3 本、買い足さないと。

なんか「沼」にハマる感じ。

 

DS1517 とか、DS 1517+ とか言う機種を考えてたんですけど

(これらは 5ベイだけど、拡張ユニットで 15 ベイまで増やせる)

 

カカクコムのレビューなんか見ると、

  「CPU は性能低い」

とかディスられてたりもして。

うーむ。悲しい。

 

自分に知識があれば、Ubuntu でデータサーバー組むんだけどなぁ。。。

 

と、妄想しています。

 

とりあえず、現状、運用方法を変えてます。

 

NAS はデータのバックアップのみで使用。

 

1.メインのノートパソコンのクラウドバックアップ

 

2.ディープラーニングの大量データ保存。

  常時同期はやめる。

  データバックアップは、FTP? みたいに、

   ブラウザ上でアップロード・ダウンロード。

  重いデータは USBメモリとか、外付け HDD でやりとり

 

という感じ。

 

メインの PC のバックアップは、不安なんですけどね。

NAS にうまく同期されてないことがありましたし。

一応 外付け HDD にも時々保存しています。

 

 

現状に不満あって。

なんと言っても、転送が遅いので。

 

今から思えば、

ふつーに 2.5 か 3.5 の HDD を裸で買って

USB でつないで外付け HDD 風に使う

 

のが、一番ストレスなかったかもです。