
AppleSiliconでCUDAコンテナが動かない?エラーの原因と解決策
はじめに
Apple Silicon搭載のMacでDockerを使用してCUDAコンテナであるnvidia/cuda:12.5.1-cudnn-devel-ubuntu22.04のイメージを実行しようとしたところ、Illegal instructionエラーが発生しました。本記事では、その原因と解決策を解説します。
検証環境
ハードウェア: Apple M1 Pro (Apple Silicon)
OS: macOS Sonoma
Docker Version: 27.4.0 (build bde2b89)
Docker Desktop: 4.3.72
Dockerイメージ: nvidia/cuda:12.5.1-cudnn-devel-ubuntu22.04
発生したエラー
今回使用したAppleSiliconはarm64アーキテクチャですが、nvidia/cudaの公式イメージはlinux/amd6`向けに作られています。そのため、以下のように`--platform`オプションを指定してビルドを行いました。
docker build --platform linux/amd64 -t docker_sample .
ビルドは成功しましたが、コンテナ内でPythonコードを実行すると、以下のエラーが発生しました。
docker run -it --rm --name docker_sample bash # コンテナに入る
python3 main.py # Python処理を実行
エラー内容:
Illegal instruction
原因
このエラーの主な原因は、Dockerの仮想マシン(VM)オプションとイメージのアーキテクチャの不一致です。
Dockerの仮想マシン(VM)オプション
M1 MacのDocker Desktopでは、以下の3つのDocker VMオプションを選択できます。
DockerVMM
Apple Virtualization Framework
QEMU(Legacy)
今回の問題が発生した環境では、Apple Virtualization framework が選択されていました。この設定では、`amd64`のエミュレーションが適切に行われず、Illegal instructionエラーが発生していたと考えられます。
解決策
1. DockerのVM設定を変更する
Docker Desktopの設定で、VMのオプションを変更することで解決できます。
Docker Desktopを開く
Docker Desktopの右上にある歯車を選択して設定画面を開く
Settings(設定) → General に移動
Virtual Machine Options で DockerVMM または QEMU(Legacy) を選択
設定を保存し、Dockerを再起動


この変更後、Illegal instructionエラーが解消され、正常に動作しました。
まとめ
nvidia/cudaのDockerイメージをAppleSiloconのMacで動かす時は、Apple Virtualization Framework(Rosetta) を使用すると、`Illegal instruction`エラーが発生する可能性がある。
DockerVMM または QEMU(Legacy) に切り替えることで解決。
M1 Macでamd64向けのDockerイメージを利用する際は、VMの設定を確認することが重要です。同様のエラーが発生した場合は、まずDockerVMのオプション設定を見直してみることをお勧めします。
付録: Apple Virtualization frameworkを使用する場合
Apple Virtualization Framework(Rosetta) で正常に動作することもあります。
例えば、AzureSQLEdge(SQL Server)がその場合に該当します。https://hub.docker.com/r/microsoft/azure-sql-edge
具体的には、platformオプションをlinux/amd64として、ビルド後に以下のVM設定をすることでエラーを発生することなく実行します。
VM設定
Apple Virtualization framework(Rosetta) を選択
Use Rosetta for x86_64/amd64 emulation on Apple Silicon をチェック

この設定では正常に動作しますが、DockerVMM や QEMU(Legacy) を選択すると動作しないことがあります。
このように、使用するDockerイメージによって適切なVMオプションが異なるため、選択時には注意が必要です。