技術関連の覚書

案件でやったり自宅で試したことの覚書

dockerでnvidia

今回、仕事で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 してから実行。

今度はうまく行ったようだった。

明日、ちゃんと設定を直して実際に動作するかを検証します。