松尾研LLMコンペ2025が開催され、その中で得られた知見の一つとして、環境構築について記載します。
背景
コンペ主催者からは、Verlという事後学習用のライブラリをCondaで構築する方法が共有されていました。しかしながら、いくつか課題がありました。
- チームコンペという性質上、分担して実験を行いたいが、環境構築に時間がかかる、環境構築が個々人に依存するため必ずしも同じ状態を作れない
- 環境構築に時間がかかり、バージョン依存も多いため、バージョンアップや他のライブラリを試すことが困難になる
- 環境構築に貴重なGPUリソースをつかってしまう
- Condaとpipのどちらになにをインストールすべきか判断が難しい
コンテナを用いる利点
上記の問題を解決し、開発の高速化を図るため、コンテナを利用しました。
コンテナでは必要なライブラリをインストールしておいた環境を予め容易することができます。そのため、コンテナを利用すれば、予め誰かが一人動作確認できれば、そのコンテナを用いるだけで、実験環境の共有ができます。
次に、NVCのPytorchコンテナを利用することで、インストールに時間のかかるapexやtransformer engineを予めインストールした状態から、使用したいライブラリをインストールして使用することが可能になります。これによって、バージョンアップや別ライブラリの試行が行いやすくなったと感じます。
さらに、GPUマシンが手元にあれば、自分のマシンでコンテナのbuildができるのも魅力的な点です。デバッグ作業などが手元でできるため、エージェントの補助を受けることができますし、スパコンの貴重なGPUリソースを使う必要がありません。
最後に、すべてシステムpythonにインストールするため、Condaとpipの使い分けの必要もありません。
Singularityについて
SingularityはDockerのようなコンテナエンジンです。Dockerとは異なり、ユーザ権限で起動できるため、スパコンのようなrootユーザを使用することができない環境において、セキュアにコンテナを利用することが可能です。詳細はこちらの資料を参照下さい。
構築方法
Singularityコンテナを構築するおすすめ手順は以下のとおりです。
- 手元のマシン(GPUあり)で、Dockerコンテナを構築し、Docker Hubにpushする
- DockerHubから、コンテナでサンドボックスモードで、Singularityコンテナを構築
- shellコマンドやrunコマンドを通じて、Singularityコンテナを使用する
以下詳細を述べます。
手元のマシン(GPUあり)で、Dockerコンテナを構築し、Docker Hubにpushする
こちらは通常のDockerコンテナを構築する方法と同様です。例えば、TRLのコンテナは以下のDockerfileを作成しました。
FROM nvcr.io/nvidia/pytorch:25.05-py3
RUN pip install --upgrade pip
COPY requirements.txt .
RUN pip install -r requirements.txt
RUN ln -s /usr/local/cuda/compat/lib.real /usr/local/cuda/compat/lib
まず、ベースコンテナをNVCのPytorchコンテナである、nvcr.io/nvidia/pytorch:25.05-py3としています。
このバージョンを用いるのは、 HuggingfaceのDatasetsと依存関係の不整合を起こすためです。drillというライブラリで不整合を起こしていました。
次に、必要なrequirements.txtを用意して、pip installをしています。直接Dockerfileに記載しても問題ありません。(むしろその方が、失敗時にCacheを利用できて良いかもしれません。)
最後の行ですが、25.05-py3バージョンでは、/usr/local/cuda/compat/lib
が不在のため、torchがcudaを認識できないというエラーが起きました。そのため、シンボリックリンクをつけています。
Dockerfileが用意できたら、buildして、pushをします。
$ docker build . -t llm0compe-trl:v1
$ docker tag llm-compe-trl:v1 <your-account-name>/llm-compe-trl:v1
$ docker push <your-account-name>/llm-compe-trl:v1
DockerHubから、コンテナでサンドボックスモードで、Singularityコンテナを構築
以下のコマンドで、サンドボックスモードでsingulairtyコンテナを構築します。
$ SINGULARITY_CACHEDIR=/path/to/cache singulairty \
build -s /path/to/trl_container \
docker://<your-account-name>/llm-compe-trl:v0.3
-s
がサンドボックスモードを指します。 /path/to/trl_container
以下にコンテナの中身が展開されます。例えば、今回のコンペのチーム共有ディレクトリである、/home/Competition2025/P04/shareP04/trl_container
に展開したコンテナは以下のとおりです。
user: P04U011 on osk-cpu01 P04/shareP04/trl_container
❯ ls
bin boot dev environment etc home lib lib64 lib.usr-is-merged media mnt opt proc root run sbin singularity srv sys tmp usr var workspace
よく見かける、linuxの配置になっています。ちなみに、/workspace
はNVCのPytorchコンテナの使用例などが含まれています。
なお、sandboxモードにしないと、コンテナのイメージファイルが作成されます。.sif
とするのが、慣例のようです。イメージファイルの場合、一度コンテナを抜けると状態が保存されません。
shellコマンドやrunコマンドを通じて、Singularityコンテナを使用する
singularity shell
コマンドを用いることでコンテナ環境でshellを開くことができます。このコマンドは動作検証などで便利です。コマンドは以下の通りです。
$ singularity shell -w -nv -B /mount/path /path/to/container
-w
を用いることで、コンテナに書き込みができます。 -B
を用いるとボリュームマウントできます。-nv
はGPUを使うために必要です。(ただし、nvidia-smiなどは使用できませんでした。)/mount/path
は、共有ディレクトリなどを指定することをおすすめします。今回のコンペでは/home
を使用すると、自分のhomeと共有ディレクトリを同時にマウントできて便利でした。なお、参考資料等にある、-f
オプションは、今回のスパコン環境では使用できませんでした。
動作検証が終了して、bashやpythonコマンドをスクリプトに対して実行する場合は、singularity run
コマンドが便利です。コマンドは以下の通りです。
$ singularity run -w --nv -B /mount/path /path/to/container/ bash your_script.sh
なお、スパコン環境によっては、singularityではなく、apptainerがインストールされている場合があります。ほとんど同じですが、こちらの記事等を参考にしてください。
注意点
- TransformerEngineにバグがあるようで、NVCのPytorchコンテナを使っていれば、すべて問題がないというわけでもありません。
まとめ
今回は、松尾研LLMコンペ2025で開発効率化のために活用した、コンテナでの環境構築方法を紹介しました。途中で紹介した、こちらの資料には、概ね記載されていますが、入門として、スパコン利用される方の役に立てば幸いです。
謝辞
本プロジェクトは、国立研究開発法人新エネルギー・産業技術総合開発機構(以下「NEDO」)の「日本語版医療特化型LLMの社会実装に向けた安全性検証・実証」における基盤モデルの開発プロジェクトの一環として行われます。