概要

  • 現職場環境からアクセスできるスパコンで、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を使ったジョブが実行された。