見出し画像

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オプションを選択できます。

  1. DockerVMM

  2. Apple Virtualization Framework

  3. QEMU(Legacy)

今回の問題が発生した環境では、Apple Virtualization framework が選択されていました。この設定では、`amd64`のエミュレーションが適切に行われず、Illegal instructionエラーが発生していたと考えられます。

解決策

1. DockerのVM設定を変更する

Docker Desktopの設定で、VMのオプションを変更することで解決できます。

  1. Docker Desktopを開く

  2. Docker Desktopの右上にある歯車を選択して設定画面を開く

  3. Settings(設定) → General に移動

  4. Virtual Machine OptionsDockerVMM または QEMU(Legacy) を選択

  5. 設定を保存し、Dockerを再起動

2.DockerDesktopの右上にある歯車を選択して設定画面を開く
4.Settings/GeneralでのDockerVMの設定画面


この変更後、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 をチェック

Apple Virtualization frameworkの設定画面

この設定では正常に動作しますが、DockerVMMQEMU(Legacy) を選択すると動作しないことがあります。

このように、使用するDockerイメージによって適切なVMオプションが異なるため、選択時には注意が必要です。

いいなと思ったら応援しよう!