onnx-mlir

Logo

MLIRコンパイラインフラストラクチャにおけるONNXモデルの表現と参照の低減

GitHubでプロジェクトを見る onnx/onnx-mlir

操作方法

Pythonを使用した推論
C/C++を使用した推論
Javaを使用した推論

リファレンス

ONNXダイアレクト
OMTensor C99ランタイムAPI
OMTensorList C99ランタイムAPI
OMTensor JavaランタイムAPI
OMTensorList JavaランタイムAPI
ONNXダイアレクトの生成
ドキュメントについて

開発

操作の追加
テストガイドライン
エラー処理
コマンドラインオプション
計測
定数伝播
アクセラレータの追加

ツール

ツール

RunONNXModel.py
DocCheck

このプロジェクトは、onnxによって管理されています。

GitHub Pagesでホストされています — テーマ by orderedlist

Linux / OSXへのONNX-MLIRのインストール

ここでは、LinuxおよびOSXにONNX-MLIRをインストールする手順を紹介します。Macでは、いくつかのコマンドが異なります。これらの違いは、必要に応じて以下の説明に記載されます。AppleシリコンへのONNX-MLIRのインストールはネイティブでサポートされており、前提条件の管理にはbrewを使用することをお勧めします。

MLIR

まず、MLIRを(LLVM-Projectの一部として)インストールします。

git clone -n https://github.com/llvm/llvm-project.git
# Check out a specific branch that is known to work with ONNX-MLIR.
cd llvm-project && git checkout 00128a20eec27246719d73ba427bf821883b00b4 && cd ..
mkdir llvm-project/build
cd llvm-project/build

cmake -G Ninja ../llvm \
   -DLLVM_ENABLE_PROJECTS="mlir;clang;openmp" \
   -DLLVM_TARGETS_TO_BUILD="host" \
   -DCMAKE_BUILD_TYPE=Release \
   -DLLVM_ENABLE_ASSERTIONS=ON \
   -DLLVM_ENABLE_RTTI=ON \
   -DENABLE_LIBOMPTARGET=OFF \
   -DLLVM_ENABLE_LIBEDIT=OFF

cmake --build . -- ${MAKEFLAGS}
cmake --build . --target check-mlir

onnx-mlirの並列化を有効にするには、llvm-projectを次のように設定する必要があります。

cmake -G Ninja ../llvm \
   -DLLVM_ENABLE_PROJECTS=mlir \
   -DLLVM_TARGETS_TO_BUILD="host" \
   -DCMAKE_BUILD_TYPE=Release \
   -DLLVM_ENABLE_ASSERTIONS=ON \
   -DLLVM_ENABLE_RTTI=ON \
   -DLLVM_ENABLE_LIBEDIT=OFF

ONNX-MLIR(このプロジェクト)

ビルド

MLIR_DIR cmake変数は、onnx-mlirをビルドする前に設定する必要があります。これは、llvm-projectのビルドまたはインストールディレクトリ(例:llvm-project/build/lib/cmake/mlir)内のmlir cmakeモジュールを指している必要があります。

このプロジェクトでは、ユニットテストにlit(LLVMの統合テスター)を使用しています。cmakeを実行するときに、LLVM_EXTERNAL_LIT変数を使用してLLVMのlitツールへのパスを指定することもできますが、MLIR_DIRがllvm-projectのビルドディレクトリを指している限り、これは必須ではありません。 MLIR_DIRがllvm-projectのインストールディレクトリを指している場合、LLVM_EXTERNAL_LITが必要です。

ONNX-MLIRをビルドするには、次のコマンドを使用します(以下で説明する追加の-DCMAKE_CXX_FLAGS引数を使用する場合があります)。

ファイルと同じ: <> ({“ref”: “utils/install-onnx-mlir.sh”, “skip-doc”: 2})

git clone --recursive https://github.com/onnx/onnx-mlir.git

# MLIR_DIR must be set with cmake option now
MLIR_DIR=$(pwd)/llvm-project/build/lib/cmake/mlir
mkdir onnx-mlir/build && cd onnx-mlir/build
if [[ -z "$pythonLocation" ]]; then
  cmake -G Ninja \
        -DCMAKE_CXX_COMPILER=/usr/bin/c++ \
        -DCMAKE_BUILD_TYPE=Release \
        -DLLVM_ENABLE_ASSERTIONS=ON \
        -DMLIR_DIR=${MLIR_DIR} \
        ..
else
  cmake -G Ninja \
        -DCMAKE_CXX_COMPILER=/usr/bin/c++ \
        -DCMAKE_BUILD_TYPE=Release \
        -DLLVM_ENABLE_ASSERTIONS=ON \
        -DPython3_ROOT_DIR=$pythonLocation \
        -DMLIR_DIR=${MLIR_DIR} \
        ..
fi
cmake --build .

# Run lit tests:
export LIT_OPTS=-v
cmake --build . --target check-onnx-lit

OSX Big Sur以降、デフォルトのコンパイラの変更により、上記のcmake ..コマンドに-DCMAKE_CXX_COMPILER=/usr/bin/c++オプションを追加してください。

環境変数$pythonLocationを使用して、Pythonコンパイラのベースディレクトリを指定できます。

上記のコマンドが成功すると、onnx-mlir実行可能ファイルがDebug/binまたはRelease/binディレクトリに表示されます。

CPU最適化の有効化

コンパイラの実行速度を向上させるために(生成されるコードに影響を与えることなく)、上記のcmake -G Ninja ..ビルド構成ステップに-DCMAKE_CXX_FLAGS=-march=nativeを渡して、ローカルCPUのすべての機能を利用するコードを生成できます。ただし、移植性が犠牲になります。または、特定のCPU機能を有効にすることもできます。たとえば、-DCMAKE_CXX_FLAGS=-mf16cを使用してF16C機能を有効にし、float16と(32ビット)float間のネイティブ変換を有効にします。これは、src/Support/SmallFP.hppで使用されます。

既知のMacOSの問題

jsoniterの問題

onnx-mlirのビルド時に既知の問題があります。この種エラーが表示された場合

Cloning into '/home/user/onnx-mlir/build/src/Runtime/jni/jsoniter'...

[...]

make[2]: *** [src/Runtime/jni/CMakeFiles/jsoniter.dir/build.make:74: src/Runtime/jni/jsoniter/target/jsoniter-0.9.23.jar] Error 127
make[1]: *** [CMakeFiles/Makefile2:3349: src/Runtime/jni/CMakeFiles/jsoniter.dir/all] Error 2
make: *** [Makefile:146: all] Error 2.

jsoniterが修正されるまでの推奨される回避策は次のとおりです。mavenをインストールし(例:brew install maven)、シェルでalias nproc="sysctl -n hw.logicalcpu"を実行します。

Protobufの問題(Mac M1、現在必要なprotobuf 4.21.12に固有)

Mac M1では、protobufのビルドに問題が発生する場合があります。特に、onnxのインストール(pip install -e third_party/onnx経由)に失敗するか、onnx-mlirのコンパイルに失敗する可能性があります(InternalMetadata::~InternalMetadataのarm64シンボルがありません)。

最初の失敗は、複数のバージョンのprotobufがあることが原因である可能性があります。 brewを使用してバージョンをインストールしても役に立ちませんでした(以下のパッチで修正できる既知のバグのため、バージョン4.21.12)。brewバージョンをアンインストールし、pipで適切なバージョンをインストールしてください:pip install protobuf== 4.21.12

2番目の失敗は、protobufソースコードをダウンロードし、パッチを適用し、ローカルマシンにインストールすることで修正できます。クローニング手順については、Dockerfile.llvm-projectの66行目をご覧ください。適切なバージョンをクローンした後、上記のリンクからパッチをダウンロードして適用する必要があります。次に、Dockerfile.llvm-projectファイルの手順に従ってください(ldconfigステップは結果なしでスキップしました)。いくつかのツールをbrewする必要があるかもしれません。上記のDockerfile.llvm-projectファイルのyum installを参照してください。その後、protobufを正常にインストールし、onnx-mlirをコンパイルできるはずです。 third_partyonnx-mlir間の依存関係が問題を引き起こす可能性があるため、third_partyディレクトリを削除し、git submodule update --init --recursiveを使用して再インストールし、onnxを再インストールし、onnx-mlir/buildを削除して、onnx-mlirを最初から再ビルドするのが常に安全です。

ビルドの問題のトラブルシューティング

役立つヒントについては、このページを確認してください。