今回、仕事でdockerでnvidia環境を使うのでメモ書きとして残しておきます。
NVIDIAというのはグラフィックドライバでバージョンによる依存関係がかなり高めです。
構成としては、ubuntu16.04(AWS EC2インスタンス、p2.xlarge)nvidia-396+cuda9.1+cuDNN7.1.3.16
とりあえず、nvidia-dockerでbuild、runするようなのでDockerfileを作る。
ベースにしたのはnvidia/cuda:9.1-runtime-ubuntu16.04
必要なライブラリ等をapt update && apt install
あとは、実機(EC2インスタンス)で作った手順をそのままDockerfileに書いていきます。
→失敗
実機で運用していたときはサービスとして運用していたためsystemctlが起動できないといけません。
そして、systemctl が動くようにするためには/sbin/initが起動してなければいけません。
dockerでは1つのコンテナに1つのAPIが基本になるのでサービスにしていくつも立ち上げるということはあまりしないのでinitは動いていません。
initを動かしたい場合は--privilegedオプションをつけて起動します。
しかし、これで動かした場合やたらとCPUを食います1コンテナ起動して40%くらい、2つ起動したらフリーズしました。
20以上のコンテナを同時に起動する必要がある要件なので、今回の運用に適していません。
次の方法は、サービス化せずに直接起動する方法です。
xxxx.serviceファイルに起動の仕方が書いているのでそのまま実行してみます。
→失敗
syslogに書き込めないというようなエラーだったため、syslogdが動いていないためかと思い、再度--privileged オプションをつけて/sbin/initを起動してみる
そうすると、うまく起動するようになる。
しかし、これでは最初の目的が果たせずに、複数コンテナの同時起動が困難。
どうにかして/sbin/initを動かさずに動作させたい。
logの送り先の設定が変えられないかと思い、サービスの置いてあるディレクトリでgrep -iR "log" を実行。
AWSへの認証関係の設定ファイルを発見してそれを使ってCLoudWatchに送っているようだ。
このIDに見覚えがあったのは去年AWSでCI/CD環境を作る案件をやっていたので、もしかして、AWSCLIがないからかと思い、
apt install awscli してから実行。
今度はうまく行ったようだった。
明日、ちゃんと設定を直して実際に動作するかを検証します。