概要
- 現職場環境からアクセスできるスパコンで、gpuを使ったコードを実行しようとする時、singularity経由でないとcudaの設定周りで怒られることがある。
- 例えばjuliaのコードはコンテナを経由せずとも実行できたが、pythonでは怒られが発生してしまう。
- このためやむを得ずコンテナに入門することになった。
- docker hubやsingularity hubのコンテナを利用するのが手っ取り早いが、勉強のためにdockerのコンテナを一から作って、singularityのコンテナに変換してみることにした。
- 作業内容をここにメモしておく。
dockerのインストール
プロキシ設定
- dockerからプロキシが見えるように、以下を作成
$ sudo mkdir -p /etc/systemd/system/docker.service.d
$ sudo vim /etc/systemd/system/docker.service.d/http-proxy.conf
- 以下を記述
[Service]
Environment="HTTP_PROXY=http://proxy_address:port"
Environment="HTTPS_PROXY=http://proxy_address:port"
Environment="NO_PROXY=localhost"
- dockerを再起動
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker
- コンテナが作成されたときにプロキシが設定されるよう、以下を作成
$ mkdir ~/.docker
$ vim ~/.docker/config.json
- 以下を記述
{
"proxies":
{
"default":
{
"httpProxy": "http://proxy_address:port",
"httpsProxy": "http://proxy_address:port",
"noProxy": "localhost"
}
}
}
pythonの実行環境を作成:
- ここ を参照
- ディレクトリ構成は下記のようにする
.
├── docker-compose.yml
├── Dockerfile
├── .env
├── requirements.txt
└── src
├── main.py
Dokerfile
は下記のようにする
FROM python:3
USER root
RUN apt-get update
RUN mkdir -p /root/src
COPY requirements.txt /root/src
WORKDIR /root/src
RUN pip install --proxy="http://user:pass@proxy_address:port" --upgrade pip
RUN pip install --proxy="http://user:pass@proxy_address:port" --upgrade setuptools
RUN pip install --proxy="http://user:pass@proxy_address:port" -r requirements.txt
以下補足:
- USERをrootにすると注意されるのであんまり良くなさそう
- pipはproxyが見えないので、
--proxy
コマンドで指定する requirements.txt
には、pythonの実行ファイルが必要とするライブラリを記述しておく- ここによると、ベースイメージはもっと軽量なものを選ぶべきな気がする
docker-compose.yml
は下記のようにする
version: '3'
services:
python3:
restart: always
build: .
container_name: 'python3'
working_dir: '/root/src'
tty: true
volumes:
- ${SRC_PATH}:/root/src
.env
には下記を記述する
SRC_PATH=./src
コンテナをbuild、起動、pythonの実行
- 下記コマンドを実行してbuild
docker-compose build
- うまくいけば、下記のようなコンテナimageが作成される
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
python_python3 latest 5db246979fc6 2 hours ago 6.6GB
- 下記で起動
$ docker-compose up -d
- 下記でpythonスクリプトを実行できる
$ docker exec -it python3 python main.py
Singularityのインストール
- 上で作成したdockerのイメージを、singularityの.sif形式に変換する
- 公式ドキュメント を参考にすればsingularityをインストールできる。
- goのバージョンを1.17以上にすることと、singularityのバージョンをスパコンのものと合わせることに注意
- 困ったらgoを一度消去してから再インストールすると上手くいく気がする
DockerファイルをSingularityファイルに変換
- 下記を入力すると、5分ほどで
python-singularity.sif
が生成される
$ sudo singularity build python-singularity.sif docker-daemon://python_python3:latest
- 生成されたファイルをスパコンに送って
singularity exec --nv `python-singularity.sif` python main.py
などと書かれたファイルをsbatchで投げると、GPUを使ったジョブが実行された。