MLIRコンパイラインフラストラクチャにおけるONNXモデルの表現と参照の低減
GitHubでプロジェクトを見る onnx/onnx-mlir
このプロジェクトは、onnxによって管理されています。
GitHub Pagesでホストされています — テーマ by orderedlist
ここでは、LinuxおよびOSXにONNX-MLIRをインストールする手順を紹介します。Macでは、いくつかのコマンドが異なります。これらの違いは、必要に応じて以下の説明に記載されます。AppleシリコンへのONNX-MLIRのインストールはネイティブでサポートされており、前提条件の管理にはbrewを使用することをお勧めします。
まず、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
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
ディレクトリに表示されます。
コンパイラの実行速度を向上させるために(生成されるコードに影響を与えることなく)、上記のcmake -G Ninja ..
ビルド構成ステップに-DCMAKE_CXX_FLAGS=-march=native
を渡して、ローカルCPUのすべての機能を利用するコードを生成できます。ただし、移植性が犠牲になります。または、特定のCPU機能を有効にすることもできます。たとえば、-DCMAKE_CXX_FLAGS=-mf16c
を使用してF16C機能を有効にし、float16と(32ビット)float間のネイティブ変換を有効にします。これは、src/Support/SmallFP.hpp
で使用されます。
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"
を実行します。
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_party
とonnx-mlir
間の依存関係が問題を引き起こす可能性があるため、third_party
ディレクトリを削除し、git submodule update --init --recursive
を使用して再インストールし、onnx
を再インストールし、onnx-mlir/build
を削除して、onnx-mlir
を最初から再ビルドするのが常に安全です。
役立つヒントについては、このページを確認してください。