LoginSignup
1
3

いまさらUbuntu20.04LTS + docker + tensorflow(GPU) + jupyter notebook で環境構築

Last updated at Posted at 2023-04-20

初めに

備忘録です.
2023/04/12くらいでもできることを確認しました. 参考文献は最後にまとめてあります.

構築

1. nvidiaドライバを当てる

nividia-smi

GPUが表示されればOK.

SecureBootが有効だとめんどくさいのでOFFにすること.

ドライバを入れる必要がある時

いくつか方法がある. (apt使うとか, nvidiaのサイトからshell scriptコピーしてきて最後の行をcuda-driverにする方法など)

今回はaptを利用する.

sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt update

でリポジトリ追加して

ubuntu-drivers devices

で推奨ドライバを確認する.
推奨と同じ番号のopenとついてないのを選ぶ(大事).
openの方を選ぶと大体こける.(なぜ?)

sudo apt install nvidia-driver-525

でインストールして再起動.

2. Dockerのインストール

sudo apt update
sudo apt install -y ca-certificates curl gnupg lsb-release
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io
sudo gpasswd -a $USER docker
exit

再度shellで

docker -v

であたればOK.

2.1. こける時

この方法でもOK

sudo apt update
sudo apt install -y \
  ca-certificates \
  curl \
  gnupg \
  lsb-release
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg  
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
sudo usermod -aG docker $USER
newgrp docker
docker -v

GPGの何ちゃらが合わん.おかしい.と言われた時は,/usr/share/keyrings/docker-archive-keyring.gpgを消してやり直すとうまく行くかも.

3. nvidia-container2のインストール

distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
      && curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
      && curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.list | \
            sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
            sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
sudo apt update
sudo apt install -y nvidia-docker2

これで再起動する

sudo docker run --rm --gpus all nvidia/cuda:11.0.3-base nvidia-smi

nvidia-smiでGPUが当たればOK.
何はともあれdockerの中でGPUが使えるようにする.

4. tensorflowの環境構築

4.1. jupytertensorflowのDockerイメージを持ってくる

docker pull tensorflow/tensorflow:latest-gpu-jupyter

で入れる

docker run --gpus all -it tensorflow/tensorflow:latest-gpu-jupyter bash

で動作確認.画面にクソデカTensorflowが出たらOK. 中でnvidia-smiも叩いて本当に--gpus allが効いているかみておく.ダメな場合, nvidia-container2がおかしいので, そっちを入れ直す.
exitでdeattchしてから, docker ps -aqで調べてdocker rm (PID)で殺しておく.

VSCの

  • Docker
  • Python
  • Remote-Containers
  • Remote-SSH

とか入れておくとても便利.

4.2. docker composeのインストトール

sudo apt-get update
sudo apt-get install docker-compose-plugin

で入れて

docker compose version

で見れればOK

4.3. Docker 環境の構築

作業ディレクトリを掘る.自分のhomeしたとか

mkdir ~/containers
cd  ~/containers
touch Dockerfile devcontainer.json docker-compose.yml

みたいな感じで作っておく.

4.3.1. Dockerfile
FROM tensorflow/tensorflow:latest-gpu-jupyter

RUN apt-get update
ARG UID=1000
RUN useradd -m -u ${UID} user

USER ${UID}

ADD  --chown=user:user . /work

RUN pip install matplotlib
RUN pip install scikit-learn
RUN pip install numpy

4.3.2. devcontainer.json

{
	"name": "Existing Dockerfile",
	"context": "..",
	"dockerFile": "./Dockerfile",
	"workspaceFolder": "/tf",
	"settings": { 
		"terminal.integrated.shell.linux": "/bin/bash",
		"python.pythonPath": "/usr/local/bin/python",
		"python.linting.enabled": true,
		"python.linting.pylintEnabled": true,
		"python.linting.pylintPath": "/usr/local/bin/pylint"
	},
	"appPort": [ 9000 ],
	"remoteUser": "user",
	"extensions": [
		"ms-python.python"
		]
}

4.3.3. docker-compose.yml

version: '3'
services:
  tensorflow:
    build: .
    volumes:
      - ../:/tf/work
    working_dir: /tf
    ulimits:
      memlock: -1
      stack: -1
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              capabilities: [ gpu ]
    tty: true
    expose:
      - "8888"
    ports:
      - "127.0.0.1:8888:8888"
    environment:
      - NVIDIA_VISIBLE_DEVICES=all
      - NVIDIA_DRIVER_CAPABILITIES=all

5. Compose Upする

VSCodeでさっきのディレクトリ開いてymlをcompose upしてコンテナ作る. そのコンテナにVSCode上アタッチしてもよし. ブラウザでlocalhost:8888でjyupterNoteBook開いてもよし.

ただしjupyter notebookは初回VSCodeでアタッチして

jupyter notebook list

とやってから表示されるtoken(token=?のとこ) をコピーしてpassword or tokenにぶち込む.もしくは,
したの方に行くと毎回token入れるのだるい人向けにパスワードを自由に設定できる.

6. Jupyter とか

サーバになっているので, jupyter notebookの設定でlocalhost以外も許可すれば, 他のPCとかからもアクセスできる. めんどい場合は, SSHで接続してポートフォワーディングすれば楽かも.

特にローカルで使うならjupyterの接続許可IPを0.0.0.0とかにしてしまってもいいと思う.
外部に建てているのなら証明書とかちゃんと作ってやった方が良い.

参考文献

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3