EC2 g4dn インスタンス+Amazon Linux 2023にAudioCraftを入れる

Amazon EC2の g4dn インスタンス ＋ Amazon Linux 2023 AMI の構成に Meta 社の [AudioCraft](https://audiocraft.metademolab.com/) をインストールしたので、手順の備忘録です。

## 1. インスタンスを起動する
インスタンスタイプを g4dn 、AMI に Amazon Linux 2023 を選んで起動します。
手元で作業した際の具体的な構成は以下のとおりです。

- インスタンス: g4dn.xlarge
- アーキテクチャ 64ビット(x86)
- AMI: Amazon Linux 2023 AMI 2023.5.20241001.1 x86_64 HVM kernel-6.1 
    - AMI ID: ami-0fff1b9a61dec8a5f

ルートボリュームは64GBだとギリギリなので128GBにしました。モデルを色々追加するならもっと容量は増やしたほうが良いと思います。

## 2. NVIDIAのドライバを入れる

Amazon Linux 2023 の AMI には NVIDIAのドライバがプリインストールされているものがないので、以下の手順に従ってインストールします。

https://repost.aws/articles/ARwfQMxiC-QMOgWykD9mco1w/how-do-i-install-nvidia-gpu-driver-and-optionally-cuda-toolkit-in-amazon-linux-2023

## 3. ffmpegとffprobe を入れる
Amazon Linux 2023 では Amazon Linux 2で使えていたインストール方法が軒並み使えなくなっているので、[このへん](https://gist.github.com/willmasters/382fe6caba44a4345a3de95d98d3aae5)の方法を参考にインストールします。

↑の記事は ffmpeg しかインストールしていませんが、ffprobeにもシンボリックリンクを貼って使えるようにする必要があります。

## 4. 必要なパッケージを入れる
後述の pip install 時に必要なパッケージが結構あるので入れておきます。
```
sudo yum groupinstall -y "Development Tools"
sudo yum install -y git cmake openblas-devel.x86_64
```

## 5. Python 3.11.6を入れる
3.11.6までなら Amazon Linux 2023 にもとから入っている Python3 と互換性が保たれるらしいので、Python 3.11.6を入れます。pip installの際にPython.hが必要になるので python3.11-devel も入れておきます。

```
sudo yum install -y python3.11-3.11.6-1.amzn2023.0.2.x86_64 python3.11-devel.x86_64 
```

## 6. AudioCraft をクローンする

```
git clone https://github.com/facebookresearch/audiocraft.git
cd audiocraft
git checkout adf0b04a4452f171970028fcf80f101dd5e26e19 # 2024/10/3時点の最新コミット
```

## 7. venv 環境に入る
```
python3.11 -m venv venv
source venv/bin/activate
```

## 8. requirements.txt の入れ替え

requirements.txt の中身を全部消して以下の内容に書き換えます。
バージョンの固定はどれも重要ですが、特に重要なのは `numpy==1.26.4` と `xformers==0.0.22.post7` の指定です。

- npmpyはバージョン1系が必要なのです。numpyバージョン2系でもインストールはできてしまうのですが、実行時にエラーで落ちます。
- xformers は0.0.22 以下だと torch 2.0.1 に依存しているため、インストールで依存関係のエラーになります

```
# for Python 3.11.6 on Amazon Linux 2023
aiofiles==23.2.1
annotated-types==0.7.0
antlr4-python3-runtime==4.9.3
anyio==4.6.0
audioread==3.0.1
av==11.0.0
blis==0.7.11
catalogue==2.0.10
certifi==2024.8.30
cffi==1.17.1
charset-normalizer==3.3.2
click==8.1.7
cloudpathlib==0.19.0
cloudpickle==3.0.0
cmake==3.30.4
colorlog==6.8.2
confection==0.1.5
contourpy==1.3.0
cycler==0.12.1
cymem==2.0.8
decorator==5.1.1
demucs==4.0.1
docopt==0.6.2
dora_search==0.1.12
einops==0.8.0
encodec==0.1.1
fastapi==0.115.0
ffmpy==0.4.0
filelock==3.16.1
flashy==0.0.2
fonttools==4.54.1
fsspec==2024.9.0
gradio==4.44.0
gradio_client==1.3.0
h11==0.14.0
httpcore==1.0.5
httpx==0.27.2
huggingface-hub==0.25.1
hydra-colorlog==1.2.0
hydra-core==1.3.2
idna==3.10
importlib_resources==6.4.5
Jinja2==3.1.4
joblib==1.4.2
julius==0.2.7
kiwisolver==1.4.7
lameenc==1.7.0
langcodes==3.4.1
language_data==1.2.0
lazy_loader==0.4
librosa==0.10.2.post1
lightning-utilities==0.11.7
lit==18.1.8
llvmlite==0.43.0
marisa-trie==1.2.0
markdown-it-py==3.0.0
MarkupSafe==2.1.5
matplotlib==3.9.2
mdurl==0.1.2
mpmath==1.3.0
msgpack==1.1.0
murmurhash==1.0.10
mypy-extensions==1.0.0
networkx==3.3
num2words==0.5.13
numba==0.60.0
numpy==1.26.4
omegaconf==2.3.0
openunmix==1.3.0
orjson==3.10.7
packaging==24.1
pandas==2.2.3
pesq==0.0.4
pillow==10.4.0
platformdirs==4.3.6
pooch==1.8.2
preshed==3.0.9
protobuf==5.28.2
pycparser==2.22
pydantic==2.9.2
pydantic_core==2.23.4
pydub==0.25.1
Pygments==2.18.0
pyparsing==3.1.4
pyre-extensions==0.0.29
pystoi==0.4.1
python-dateutil==2.9.0.post0
python-multipart==0.0.12
pytz==2024.2
PyYAML==6.0.2
regex==2024.9.11
requests==2.32.3
retrying==1.3.4
rich==13.8.1
ruff==0.6.8
safetensors==0.4.5
scikit-learn==1.5.2
scipy==1.14.1
semantic-version==2.10.0
sentencepiece==0.2.0
shellingham==1.5.4
six==1.16.0
smart-open==7.0.4
sniffio==1.3.1
soundfile==0.12.1
soxr==0.5.0.post1
spacy==3.7.5
spacy-legacy==3.0.12
spacy-loggers==1.0.5
srsly==2.4.8
starlette==0.38.6
submitit==1.5.2
sympy==1.13.3
thinc==8.2.5
threadpoolctl==3.5.0
tokenizers==0.20.0
tomlkit==0.12.0
torch==2.1.0
torchaudio==2.1.0
torchdata==0.7.0
torchmetrics==1.4.2
torchtext==0.16.0
torchvision==0.16.0
tqdm==4.66.5
transformers==4.45.1
treetable==0.2.5
triton==2.1.0
typer==0.12.5
typing-inspect==0.9.0
typing_extensions==4.12.2
tzdata==2024.2
urllib3==2.2.3
uvicorn==0.31.0
wasabi==1.1.3
weasel==0.4.1
websockets==12.0
wrapt==1.16.0
xformers==0.0.22.post7
```

## 9. AudioCraft のインストール

以下を実行します。

```
pip install 'torch==2.1.0'
pip install -e .
```

以上で、audiocraft パッケージが利用できるようになります。

# おわりに
macOSでインストールがあっさり通ったので、簡単だろうとEC2にインストールを初めたところ、ビルドエラー、依存関係の問題、バージョン衝突を解決していったら完了するまで7時間掛ってしまいました。普段あまりPythonを使わないからというのもあるのですが、公開からしばらくたったAI系のPythonパッケージはしばしばインストールするのが大変ですね。