- 投稿日:2020-06-01T16:01:51+09:00
Docker(19.03)でgpu使って学習したかった時の覚書ーTensorflow/Keras
はじめに
DockerインストールしなおしてみたらDocker環境下TFやKerasで学習しようとしたときにGPU認識してくれなくてしばらくハマったので覚書です。
こういう環境にしたい
Docker 19.03
--コンテナ内--
ubuntu 18.04
cuda 10.0
cudnn 7.4
tensorflow-gpu 1.14.0
keras : latest過去記事のResNet学習環境を作ることとします。
気を付けることその0:Dockerのバージョン
まずここが違ってくるとお話になりません。
旧と現では結構コマンドも変わってきてる模様。
確認して合う環境を構築しましょうdocker環境確認方法はホスト側で以下コマンドです
docker version今回はDockerバージョン19.03を対象とします
気を付けることその1:コンテナ立ち上げ時のコマンド
いつのまにか
--runtime=nvidia
じゃなくなってたので注意
GPU使いたいときは--gpu all(もしくは番号指定)
コマンドになったんだそうで
より直感的ですね。
こちらの記事を参考
https://qiita.com/ksasaki/items/b20a785e1a0f610efa08気を付けることその2:cuda,cudnn,tensorflow-gpu,pythonのバージョン
毎回引っかかるんだけどここに齟齬あるとほんと動きません。
オフィシャルの動作確認表を参考に入れましょう
LinuxのGPU周りの整合表は以下の通りでした。macは別表へ
https://www.tensorflow.org/install/source#gpu今回はtensorflow-gpu==1.14.0が使いたかったので、それに合わせてCUDA10.0,cudnn7.4,python3.6を入れることとします。
環境構築していく
今回はcuda,cudnnのバージョンを狙い打ちたいので下記のコマンドでコンテナ立ち上げました
docker run --gpus all -it (ここにいろいろコマンド)--name test_container nvidia/cuda:10.0-cudnn7-devel-ubuntu18.04 /bin/bash実際は(ここにいろいろコマンド)部分に細々としたディスプレイ設定とかディレクトリのマウント設定とか付け足してます
過去記事参照くださいあらかじめdockerfileとかに書けたらいいんだろうけどそれもそれで面倒なので必要なものを後からいれていきます。
apt update apt install python-pip3 pip3 install tensorflow-gpu==1.14.0 keras matplotlib scikit-learn pillowこれで学習まわるはず
GPU使えてるか?の確認
学習回し始めた時にワーニング文的なのが出るのでそこ確認しても良いし
一度Ctrl + P + Q
でコンテナから抜けて
コマンドnvidia-smiでGPUの占有率見ることでも確認できます。
おわりに
Dockerまわりもう少しお勉強が必要そう
より良いコマンドを探していきたいです
- 投稿日:2020-06-01T15:04:25+09:00
TensorFlowでKaggle Titanicを解く
TensorFlowの公式チュートリアルを見て、あまり丁寧でないと思ったのでKaggle Titanicを題材にTensorFlowの使い方を解説する。
とはいえ僕もまだまだTensorFlowに対する理解が浅いので初歩的な範囲で。コード解説
実際にTitanicコンペのために組んだコード(https://www.kaggle.com/yusukemigitera/tf-first )を解説する。
インポート、データ整形
ほぼ前回(2層ニューラルネットワークでKaggle Titanicを解く)と同じ。
使うデータ項目を選択
今回はPclass(チケットクラス)、Sex(性別)、Age(年齢)、SibSp(兄弟/配偶者の数)Fare(料金)の5項目を利用したが、行列から必要な部分を切り出す方法が分からなかったので一列ずつ削除していった。
train_target = train.pop('Survived') train.pop('PassengerId') train.pop('Name') train.pop('Parch') train.pop('Ticket') train.pop('Cabin') train.pop('Embarked') train_array = np.asarray(train.values) #Numpy配列にする target_array = np.asarray(train_target.values) #Numpy配列にする dataset = tf.data.Dataset.from_tensor_slices((train_array.astype('float32'), target_array)) # TensorFlowで扱いやすい形の変数におくまた、
np.asarray()
や.astype('float32')
でデータ型を指定しなければよく分からないエラーが起きる。モデル定義、学習
model = tf.keras.Sequential([ tf.keras.layers.Dense(10, activation='relu'), tf.keras.layers.Dense(10, activation='relu'), tf.keras.layers.Dense(1, activation='sigmoid') ])
tf.keras.Sequential
というクラスのインスタンスを作る。引数に入れた配列の要素tf.keras.layers.Dense()
がニューラルネットワークの層を表す。Dense
は全結合の層で、(ノード数, 活性化関数)をその引数で指定する。入力層はこれに含めず、上から中間層2つのノードが10個ずつ、出力層のノードが1個のニューラルネットワークを定義している。
分類問題は出力層に分類の数と同じノードを用意するものだが、ここは公式チュートリアルの書き方に従った。2値分類はまた特殊なのかもしれない。
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy']) model.fit(train_array.astype('float32'), target_array, epochs=15)
compile
メソッドでオプティマイザ、損失関数、メトリクスを設定する。tf.keras.Sequential
のメソッドについてはKeras Documentationを見ると参考になる。学習の実行は
fit
メソッドの1行で書ける。この辺はフレームワークの便利さが分かる。推論
y = model.predict(test_array.astype('float32'))推論の実行も1行で書ける。
データを整形してCSVに出力
前回と同じ。
評価
スコアは前回と比べて1%だけ高くなった。まだだいぶ低いが、今回は特に最適化を考えていなかったので仕方ない。
Numpyオンリーで書くよりよっぽど楽。