AI開発 Node.js Python PyTorch 機械学習

Intel MacでPyTorchが入らないのは、PyTorch 2.3.0からmacOS x86_64向けバイナリの配布が終了したためです。torch 2.2.2 + Python 3.12以下に固定すれば今でも動きます。もう1つ見落としやすいのがNode.jsのonnxruntime-nodeで、こちらは新しい版がインストールには成功するのにIntel Mac用バイナリが入らず実行時に落ちるため、1.17.3への固定が必要でした。機械学習モデルの学習〜ONNX推論までをIntel Macで通した実測の構成をまとめます。

結論: バージョンの組み合わせ

パッケージ Intel Macで使う版 根拠
torch 2.2.2 2.3.0以降はarm64ホイールのみ (PyPIで確認)
Python 3.8〜3.12 torch 2.2.2のx86_64ホイールがcp38〜cp312
numpy <2 torch 2.2系はnumpy 2に非対応
onnxruntime (Python) 制約なし universal2ホイールでIntelも対象
onnxruntime-node 1.17.3 手元の1.27.0はdarwin/arm64のみで実行時エラー、1.17.3はx64同梱 (いずれも実測)

Python側のonnxruntimeに制約が無い点は意外で、最新版もuniversal2 (Intel/Apple Silicon両対応) で配布されています。制約はtorchとNode版だけです。

onnxruntime-nodeは「インストール成功・実行時に失敗」する

やっかいなのは症状です。npm installは正常に完了し、実行した時に初めてこう落ちます。

Error: Cannot find module (MODULE_NOT_FOUND)
  requireStack: [
    '.../node_modules/onnxruntime-node/dist/binding.js',
    '.../node_modules/onnxruntime-node/dist/backend.js',
    '.../node_modules/onnxruntime-node/dist/index.js'
  ]

binding.jsが自プラットフォーム用のネイティブバイナリをrequireしようとして見つからない、という意味です。同梱バイナリは次のコマンドで確認できます。

ls node_modules/onnxruntime-node/bin/napi-*/darwin/
# 1.27.0 → arm64 のみ
# 1.17.3 → arm64  x64

darwinの下にx64が無ければそのバージョンはIntel Macで動きません。npm add onnxruntime-node@1.17.3に下げると解決します。

uvならPythonごと固定できる

システムのPythonが3.13以降だとtorch 2.2.2のホイールが無いので、Python自体を下げる必要があります。uvならpyprojectと1コマンドで完結します。

# pyproject.toml
[project]
requires-python = ">=3.11,<3.12"
dependencies = [
  "torch==2.2.2",
  "numpy>=1.26,<2",
  "onnxruntime",
]
uv python pin 3.11
uv sync   # x86_64向けのCPython 3.11とtorch 2.2.2が入る

手元では3.11で運用していますが、ホイールの範囲では3.12でも構いません。

本番のLinuxとは両立できる

Macに合わせてonnxruntime-nodeを1.17.3に下げても、Linux x64向けバイナリは同じ版に同梱されているため本番サーバー側はそのまま動きます。ONNXモデルはopset 17で出力したものが1.17.3で読み込めることを確認しました。「開発機に合わせて古い版に固定すると本番で困るのでは」という心配は、この組み合わせでは不要です。