さくらインターネットのGPUサービス高火力 DOKでYuE（音楽生成モデル）を試す

[高火力 DOK](https://www.sakura.ad.jp/koukaryoku-dok/)はコンテナー型のGPUサービスで、NVIDIA V100とかH100を実行時間課金で利用できるサービスです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/98a7fac2-c363-088f-8072-0a6b65395fe2.png)

[コンテナー型GPUクラウドサービス 高火力 DOK（ドック） | さくらインターネット](https://www.sakura.ad.jp/koukaryoku-dok/)

今回はこの高火力 DOKで、[YuE(乐。音楽生成モデル）](https://github.com/multimodal-art-projection/YuE) を試してみました。

## 参考

[YuEを使って音楽生成を始めよう\! 🎵](https://zenn.dev/sunwood_ai_labs/articles/start-music-generation-with-yue)を参考にさせてもらっています。

## とりあえず試す

コンテナレジストリにプッシュ済みのイメージを使って実行してみたい方は、DOKにて新しいタスクを作成し、以下の情報を入力してください。

| 項目     | 設定                                                          |
| -------- | ------------------------------------------------------------- |
| イメージ | dok-handson.sakuracr.jp/yue                            |
| 環境変数 | LYRIC = https://raw.githubusercontent.com/multimodal-art-projection/YuE/refs/heads/main/prompt_egs/lyrics.txt<br />GENRE = inspiring female uplifting pop airy vocal electronic bright vocal vocal |

LYRICは歌詞が書かれたファイル、GENREは生成する音楽の雰囲気を指定します。実行完了すると、MP3ファイルが生成されます。H100で15分7秒 (907 秒)かかりました。

## コンテナイメージの作成と登録

上記タスクで利用したDockerイメージを作成する手順は以下の通りです。完成版は[goofmint/dok\-yue](https://github.com/goofmint/dok-yue)にありますので、実装時の参考にしてください。

### Dockerfile の作成

[YuEを使って音楽生成を始めよう\! 🎵](https://zenn.dev/sunwood_ai_labs/articles/start-music-generation-with-yue)の内容に沿って、Dockerfileを作成します。

#### ベースイメージ

ベースは `FROM nvidia/cuda:12.5.1-devel-ubuntu22.04` です。

```Dockerfile
FROM nvidia/cuda:12.5.1-devel-ubuntu22.04
```

#### ライブラリのインストール

Pythonと、必要なライブラリをインストールします。

```Dockerfile
RUN apt-get update && \
    apt-get install -y \
        git \
	git-lfs \
        python3 \
        python3-pip \
        wget && \
    mkdir /app /opt/artifact && \
    apt-get clean && \
    git lfs install && \
    rm -rf /var/lib/apt/lists/*
```

#### リポジトリのクローンと依存ライブラリのインストール

[multimodal\-art\-projection/YuE: YuE: Open Full\-song Music Generation Foundation Model, something similar to Suno\.ai but open](https://github.com/multimodal-art-projection/YuE)をクローンして、依存ライブラリをインストールします。

```Dockerfile
WORKDIR /app
RUN git clone https://github.com/multimodal-art-projection/YuE.git yue
WORKDIR /app/yue
# 依存ライブラリのインストール
RUN pip install -r requirements.txt && \
  pip install packaging && \
  pip install flash-attn --no-build-isolation && \
  pip uninstall -y protobuf && \
  pip install protobuf==3.20.0 && \
  pip install --upgrade tensorflow && \
  pip install --upgrade transformers

WORKDIR /app/yue/inference
RUN git clone https://huggingface.co/m-a-p/xcodec_mini_infer
```

後は 後述する `docker-entrypoint.sh` をコピーします。

```dockerfile
WORKDIR /
COPY docker-entrypoint.sh /docker-entrypoint.sh
# 実行権限を付与
RUN chmod +x /docker-entrypoint.sh

# Dockerコンテナー起動時に実行するスクリプトを指定して実行
CMD ["/bin/bash", "/docker-entrypoint.sh"]
```

### Dockerfile全体

Dockerfileの全体は以下の通りです。

```Dockerfile
FROM nvidia/cuda:12.5.1-devel-ubuntu22.04
ENV DEBIAN_FRONTEND=noninteractive
# ENV CUDA_HOME=/usr/local/cuda
# ENV PATH=${CUDA_HOME}/bin:${PATH}
# ENV LD_LIBRARY_PATH=${CUDA_HOME}/lib64:${LD_LIBRARY_PATH}

# 必要なパッケージのインストール
# /appはアプリのディレクトリ、/opt/artifactはアウトプット先のディレクトリ
RUN apt-get update && \
    apt-get install -y \
        git \
	git-lfs \
        python3 \
        python3-pip \
        wget && \
    mkdir /app /opt/artifact && \
    apt-get clean && \
    git lfs install && \
    rm -rf /var/lib/apt/lists/*

WORKDIR /app
RUN git clone https://github.com/multimodal-art-projection/YuE.git yue
WORKDIR /app/yue
# 依存ライブラリのインストール
RUN pip install -r requirements.txt && \
    pip install packaging && \
    pip install flash-attn --no-build-isolation && \
    pip uninstall -y protobuf && \
    pip install protobuf==3.20.0 && \
    pip install --upgrade tensorflow && \
    pip install --upgrade transformers

WORKDIR /app/yue/inference
RUN git clone https://huggingface.co/m-a-p/xcodec_mini_infer

WORKDIR /
COPY docker-entrypoint.sh /docker-entrypoint.sh
# 実行権限を付与
RUN chmod +x /docker-entrypoint.sh

# Dockerコンテナー起動時に実行するスクリプトを指定して実行
CMD ["/bin/bash", "/docker-entrypoint.sh"]
```

### docker-entrypoint.sh の作成

`docker-entrypoint.sh` はDockerコンテナー起動時に実行するスクリプトです。ここでは環境変数をチェックして、YuEが用意しているPythonスクリプトを実行します。

引数で歌詞とジャンルを受け取りますが、それぞれファイルとして保存してPythonスクリプトに渡しています。

```bash
#!/bin/bash

set -ue
shopt -s nullglob

export TZ=${TZ:-Asia/Tokyo}

# アウトプット先ディレクトリ（自動付与） /opt/artifact固定です
if [ -z "${SAKURA_ARTIFACT_DIR:-}" ]; then
  echo "Environment variable SAKURA_ARTIFACT_DIR is not set" >&2
  exit 1
fi

# DOKのタスクID（自動付与）
if [ -z "${SAKURA_TASK_ID:-}" ]; then
  echo "Environment variable SAKURA_TASK_ID is not set" >&2
  exit 1
fi

# 歌詞
if [ -z "${LYRIC:-}" ]; then
  echo "Environment variable LYRIC is not set" >&2
  exit 1
fi

if [ -z "${GENRE:-}" ]; then
  echo "Environment variable GENRE is not set" >&2
  exit 1
fi

# 歌詞とジャンルをファイルに保存
wget -O /app/yue/prompt_egs/lyrics.txt ${LYRIC}
echo "${GENRE}" > /app/yue/prompt_egs/genre.txt

pushd /app/yue/inference
  python3 infer.py \
    --cuda_idx 0 \
    --stage1_model m-a-p/YuE-s1-7B-anneal-en-cot \
    --stage2_model m-a-p/YuE-s2-1B-general \
    --genre_txt ../prompt_egs/genre.txt \
    --lyrics_txt ../prompt_egs/lyrics.txt \
    --run_n_segments 2 \
    --stage2_batch_size 4 \
    --output_dir ../output \
    --max_new_tokens 3000 \
    --repetition_penalty 1.1
  mv ../output/*.mp3 ${SAKURA_ARTIFACT_DIR}
popd
```

MP3ファイルは `output` ディレクトリに保存されますので、DOKの保存ディレクトリである `/opt/artifact` に移動します。


### Dockerイメージのビルド

上記の内容で、Dockerイメージをビルドします。Linux環境などで行います。

#### コンテナレジストリの用意

Dockerイメージを登録するコンテナレジストリを作成します。さくらのクラウドではLAB機能で、コンテナレジストリを提供しています。さくらのクラウドにログインしたら `さくらのクラウド` を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/e247a30c-bbc7-fb7e-136d-71ee2a795533.png)

左側のメニューの `LAB` の中にある `コンテナレジストリ` を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/25d041f2-9039-fec3-77c6-88edf5afa936.png)

`追加` を押して、コンテナレジストリを作成します。最低限、以下の入力が必要です。

| 項目                 | 設定                                                                      |
| -------------------- | ------------------------------------------------------------------------- |
| 名前                 | 分かりやすい、任意の名前を入力してください                                |
| コンテナレジストリ名 | ドメイン名に使われます。以下では、 `EXAMPLE.sakuracr.jp` として説明します |
| 公開設定             | Pullのみとします                                                          |

#### ユーザーの作成

コンテナレジストリを作成したら、作成したコンテナレジストリを一覧でダブルクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/6425f493-0ce1-db62-f322-64a51867ce58.png)

詳細表示にて、ユーザータブをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/79bdc51c-ea66-8d8f-c801-8f54346cf960.png)

追加ボタンを押し、ユーザーを作成します。 `YOUR_USER_NAME` と `PASSWORD` は任意のものを指定してください。

| 項目           | 設定           |
| -------------- | -------------- |
| ユーザー名     | YOUR_USER_NAME |
| パスワード     | YOUR_PASSWORD  |
| ユーザ権限設定 | All            |

#### Dockerイメージのビルド

DockerイメージはLinuxで行います。今回はUbuntu 24.04を使っています。Dockerが使える環境であれば、Windows + WSL2でも問題ありません。macOSの場合、アーキテクチャが異なるので動かせないかも知れません（未検証です）。

`EXAMPLE.sakuracr.jp` の部分は、作成したコンテナレジストリのドメイン名に置き換えてください。また、 `animagine` は任意の名前で大丈夫です（以下はその名称で読み替えてください）。

```bash
sudo docker build -t EXAMPLE.sakuracr.jp/animagine:latest .
```

#### コンテナレジストリへのログイン

作成したコンテナレジストリにログインします。ログインIDとパスワードが求められるので、作成したものを入力してください。

```bash
sudo docker login EXAMPLE.sakuracr.jp
```

#### イメージのプッシュ

作成したイメージをコンテナレジストリにプッシュします。イメージサイズが大きいので、数十分かかります。

```bash
sudo docker push EXAMPLE.sakuracr.jp/animagine:latest
```

### タスクを作成する

後は最初と同じようにDOKでタスクを作成、実行します。

| 項目     | 設定                                                          |
| -------- | ------------------------------------------------------------- |
| イメージ | dok-handson.sakuracr.jp/yue                            |
| 環境変数 | LYRIC = https://raw.githubusercontent.com/multimodal-art-projection/YuE/refs/heads/main/prompt_egs/lyrics.txt<br />GENRE = inspiring female uplifting pop airy vocal electronic bright vocal vocal |

![FireShot Capture 393 - 高火力 DOK - タスク › 新規作成 - secure.sakura.ad.jp.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/bd0adada-1eee-3349-8a36-b9b3f11a1c69.jpeg)

実行が完了し、MP3ファイルが生成できていれば成功です。

## まとめ

今回はYuEを使って、DOK上で音楽生成を行いました。まずは実行できるのみ、次にDockerイメージの作成と段階的に進められるようにしています。音楽生成のように、処理に時間がかかるものを利用する際にDOKは便利です。

高火力 DOKはタスクを多数立ち上げて、後は結果を待つのみと言った使い方ができます。ぜひAI・機械学習に活用してください。

[コンテナー型GPUクラウドサービス 高火力 DOK（ドック） \| さくらインターネット](https://www.sakura.ad.jp/koukaryoku-dok/)