大学でNVIDIA A100が4基入った素晴らしいGPUサーバーを借りられるんですが、以下の制約があります
- root権限がない(sudoが使えない)
- aptも使えない
- dockerは入ってるのになぜか使えない
- pipも使えない
この状況でどうにかText-to-speechモデルであるT5gemma-TTSをコンテナ上で動かすまでの備忘録です
半分大学の後輩に向けて書いてます
あくまでこの環境での備忘録なので、動かなかったら勘弁してください
(もしくはコメントで補足お願いします♡)
ちなみに筆者のスキルはこんな感じです
- Docker: まあ使える
- Podman: 使ったことない
podmanを導入する
前述した通り、Dockerが使えないのでPodmanを使用します
podmanはdockerの親戚みたいなので、ほぼDockerみたいなもの(要出典)です
大きな違いとしては
- デーモンレス: プロセスレベルでコンテナを動かせる
- ルートレス可能:ユーザー権限で動かせる(制約あり)
- docker compose的なのがない:一応追加でインストールすることで利用可能
があります
特にpodman composeはpipでインストールできますが、今回はpipが使えません。そのためdocker composeとpodmanを無理やり繋ぎ込む方法をとります
インストール
早速入れていきましょう。パッケージマネージャーは使えないので、自力で入れます
podmanのlinux向けビルドが有志によって配布されているので、これを入れます
https://github.com/mgoltzsche/podman-static
mkdir -p ~/opt/podman
cd ~/opt/podman
curl -LO https://github.com/mgoltzsche/podman-static/releases/download/v5.7.1/podman-linux-amd64.tar.gz
tar -xvf podman-linux-amd64.tar.gz
そんでもって、以下を.bashrcの末尾に追加します
export PATH="$HOME/opt/podman/podman-linux-amd64/usr/local/bin:$PATH"
export PATH="$HOME/opt/podman/podman-linux-amd64/usr/local/lib/podman:$PATH"
※source ~/.bashrcしてpodman --versionが動けばおっけー
設定ファイルを追加
~/.config/containersにファイルを3つ追加します
containers.conf
$HOMEの部分は絶対パスで
[engine]
conmon_path = ["ここに$HOME/opt/podman/podman-linux-amd64/usr/local/lib/podman/conmon"]
helper_binaries_dir = ["ここに$HOME/opt/podman/podman-linux-amd64/usr/local/lib/podman"]
registries.conf
これを入れないとpostgresみたいなshort_nameが使えない
unqualified-search-registries = ["docker.io"]
policy.json
{
"default": [
{
"type": "insecureAcceptAnything"
}
]
}
これで
podman system migrate
podman info | grep rootless
を実行してrootlessがtrueになってれば多分OK

テスト
hello-worldでテストしてみる
podman run --rm hello-world
動いた〜
GPUを使う
このサーバーにはCDIが設定されてないので、コンテナ実行時に手動でGPUを注入する必要がある
ここら辺は理解が浅いので間違ってたらゴメンなさい
nvidia-smiをコンテナ内で動かしてみる
$ ls /dev | grep nvidia
nvidia-caps
nvidia-modeset
nvidia-uvm
nvidia-uvm-tools
nvidia0
nvidia1
nvidia2
nvidia3
nvidiactl
こんな感じでデバイスが出てくるのでnvidia-caps以外をpodman runの引数に指定する
$ podman run --rm \
--device /dev/nvidia0 \
--device /dev/nvidia1 \
--device /dev/nvidia2 \
--device /dev/nvidia3 \
--device /dev/nvidiactl \
--device /dev/nvidia-uvm \
--device /dev/nvidia-uvm-tools \
--device /dev/nvidia-modeset \
-v /usr/lib/x86_64-linux-gnu:/hostlib:ro \
-v /usr/bin/nvidia-smi:/usr/bin/nvidia-smi:ro \
-e LD_LIBRARY_PATH=/hostlib \
nvidia/cuda:12.1.1-devel-ubuntu22.04 \
nvidia-smi \
これを実行するとコンテナ内でnvidia-smiを実行できた
Docker composeを使いたい
冒頭の通り、podman-composeは使えない(インストールできない)ので、最初から入っているdocker composeを代用する
まず、podmanにDockerのフリをさせます
もう一つSSHを開いて↓を実行する
$ podman system service --time=0 unix:///tmp/podman.sock
その後、元のシェルで
$ export DOCKER_HOST=unix:///tmp/podman.sock
$ docker compose ls
環境変数でDOCKER_HOSTを指定することで、composeがアクセスするソケットを指定できる
T5Gemma-TTSを動かす
ここはモデルによって変わるので、あくまで参考程度に
T5Gemma-TTSはcomposeを用意してくれているので、それをupするだけで実行できる
git clone https://github.com/Aratako/T5Gemma-TTS.git
cd T5Gemma-TTS
.envにHF_TOKEN=<HuggingFaceのトークン>を入れる
事前にイメージをビルド
なぜかcompose upでビルドが失敗したので、事前にイメージをビルドしてそれを指定する
podman build -t t5gemma-tts:local .
composeを動かす
このままでは動かない(deviceとか指定しなければいけない)ので、docker-compose.ymlを改造した
改造内容は
- build消してさっきビルドしたイメージを指定する
- network_modeをhostにした
- なぜかvolumeを使うとエラーが出たので、hf_cacheをバインドに変えた
- devices, volumes, environmentにGPUを注入した(nvidia-smiは多分いらない、一応入れてる)
services:
t5gemma-tts:
image: localhost/t5gemma-tts:local
ports:
- "${PORT:-7860}:7860"
network_mode: host
devices:
- /dev/nvidia0
- /dev/nvidia1
- /dev/nvidia2
- /dev/nvidia3
- /dev/nvidiactl
- /dev/nvidia-uvm
- /dev/nvidia-uvm-tools
- /dev/nvidia-modeset
volumes:
- /usr/lib/x86_64-linux-gnu:/hostlib:ro
- /usr/bin/nvidia-smi:/usr/bin/nvidia-smi:ro
# Persist HuggingFace cache to avoid re-downloading models
- ./hf_cache:/app/.cache/huggingface
environment:
- HF_TOKEN=${HF_TOKEN:-}
- LD_LIBRARY_PATH=/hostlib
- PODMAN_IGNORE_CGROUPSV1_WARNING=1
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: all
capabilities: [gpu]
# Override default command if MODEL_DIR is set
command: >
python inference_gradio.py
--model_dir ${MODEL_DIR:-Aratako/T5Gemma-TTS-2b-2b}
--port 7860
${EXTRA_ARGS:-}
これでdocker compose upする

動いた!
WebUIにアクセスするには適当に別のSSH開いてポートフォワーディングすればOK
$ ssh -L 7860:localhost:7860 ...
まとめ
ルート権限がない大学のGPUサーバーでpodmanを利用してコンテナ・composeを動かすことに成功した
環境によるのであくまで参考程度に…
間違いがあればコメントにお願いします!