Graph IRの代表例「Open Neural Network Exchange（ONNX）」のREADME.mdを翻訳してみた！

　深層学習にはPyTorchやTensorFlowなど様々なフレームワークがあります。これらはあくまでもプログラミングの効率化のために存在しているものであり、特定のフレームワークでないと開発出来ないモデルはありません。しかし、開発している途中でフレームワークを変えたくなるときがあります。そのときに役立つのがIR（intermediate representation、中間表現）であり、深層学習向けのIRのことを「Graph IR」と呼びます。

　ここでは2019年11月にLinux Foundationの公開プロジェクトとなったOpen Neural Network Exchange（ONNX）フォーマットを取り上げ、そのREADME.mdファイルの日本語翻訳を行います。これは、Graph IRの代表例であり、米MicrosoftとFacebookによって開発され、2017年に公開されました。多くの深層学習フレームワークがONNXに対応しています。

# Open Neural Network Exchange（ONNX）のREADME.mdの日本語翻訳はこちら

[Open Neural Network Exchange (ONNX)](https://onnx.ai) は、AI開発者を支援するオープンなエコシステムです。
は、プロジェクトの進化に合わせて適切なツールを選択することができます。ONNXは，ディープラーニングと従来のMLの両方のAIモデルのためのオープンソース・フォーマットを提供します．拡張可能な計算グラフモデルを定義しており，組み込み演算子や標準的なデータ型を使用しています。現在は推論（スコアリング）に必要な機能に注目しています。

ONNXは[広くサポートされている](http://onnx.ai/supported-tools)し、多くのフレームワーク、ツール、ハードウェアに搭載されています。異なるフレームワーク間の相互運用性を可能にし、研究から生産までのパスを合理化することは、AIコミュニティにおけるイノベーションのスピードアップに役立ちます。コミュニティの皆様にもご参加いただき、ONNXをさらに進化させていきましょう。

# ONNXを利用する
* [ONNXモデル作成のチュートリアル](https://github.com/onnx/tutorials)
* [ONNXモデルの事前学習](https://github.com/onnx/models)

# ONNXの仕様についてはこちら
* [概要] (docs/Overview.md)
* [ONNX中間表現仕様](docs/IR.md)
* [仕様のバージョン管理原則](docs/Versioning.md)
* [オペレータの説明書](docs/Operators.md)
* [Python API Overview](docs/PythonAPIOverview.md)

# ONNXグラフを操作するためのプログラミングユーティリティー
* [形状と型の推論](docs/ShapeInference.md)
* [グラフ最適化](docs/Optimizer.md)
* [オペレーションセット・バージョン変換](docs/VersionConverter.md)

# 貢献する
ONNXは[コミュニティプロジェクト](コミュニティ)です。この取り組みに参加して、フィードバック、アイデア、コードを投稿することをお勧めします。ONNXの将来を形作るために、[SIGs](community/sigs.md)や[Working Groups](community/working-groups.md)に参加することができます。

[貢献ガイド](https://github.com/onnx/onnx/blob/master/docs/CONTRIBUTING.md)を参考にしてください。

ONNXの仕様に追加すべき演算子がある場合は[このドキュメント](docs/AddNewOp.md)をご覧になってください。

# 議論をする
[Issues](https://github.com/onnx/onnx/issues)を開くか、[Slack](https://slack.lfai.foundation/)を使ってリアルタイムで議論することをお勧めします。

# フォローしてください
ONNXの最新情報をお届けします。
[Facebook](https://www.facebook.com/onnxai/) 
[Twitter](https://twitter.com/onnxai)


# インスタレーション

## バイナリー

ONNXのバイナリビルドは[Conda](https://conda.io)、[conda-forge](https://conda-forge.org/)から入手可能です。

```
conda install -c conda-forge onnx
```

## ソース

### Linux と MacOS
ONNXを構築するにはProtobufとNumPyのインストールが必要です。 簡単なこれらの依存関係を解決する方法は[アナコンダ](https://www.anaconda.com/download/)を使うことです。

```
# デフォルトではprotocが付属していないので、conda-forgeのprotobufを使用します。
conda install -c conda-forge protobuf numpy
```

これでPyPiからONNXをインストールすることができます(注: onnx-mlには環境変数 `ONNX_ML=1` を設定してください)。

```
pip install onnx
```

また、ソースコードからローカルにONNXをビルドしてインストールすることもできます。

```
git clone https://github.com/onnx/onnx.git
cd onnx
git submodule update --init --recursive
python setup.py install
```

注意:Anaconda 以外の環境でインストールする場合は、onnx の pip インストールを実行する前に Protobuf コンパイラをインストールするようにしてください。例えばUbuntuでは

```
sudo apt-get install protobuf-compiler libprotoc-dev
pip install onnx
```

### Windowsの場合
Windows上でソースからONNXをビルドする場合は、Protobufもスタティックライブラリとしてローカルにビルドすることをお勧めします。conda-forgeで配布されているバージョンはDLLであり、ONNXではスタティックライブラリであることを期待しているため、これは競合します。

#### WindowsでProtobufとONNXをビルドする
ステップ1：Protobufをローカルに構築する

```
git clone https://github.com/protocolbuffers/protobuf.git
cd protobuf
git checkout 3.9.x
cd cmake
# Explicitly set -Dprotobuf_MSVC_STATIC_RUNTIME=OFF to make sure protobuf does not statically link to runtime library
cmake -G "Visual Studio 15 2017 Win64" -Dprotobuf_MSVC_STATIC_RUNTIME=OFF -Dprotobuf_BUILD_TESTS=OFF -Dprotobuf_BUILD_EXAMPLES=OFF -DCMAKE_INSTALL_PREFIX=<protobuf_install_dir>
msbuild protobuf.sln /m /p:Configuration=Release
msbuild INSTALL.vcxproj /p:Configuration=Release
```

ステップ2：ONNXの構築

```
# Get ONNX
git clone https://github.com/onnx/onnx.git
cd onnx
git submodule update --init --recursive

# Set environment variables to find protobuf and turn off static linking of ONNX to runtime library.
# Even better option is to add it to user\system PATH so this step can be performed only once.
# For more details check https://docs.microsoft.com/en-us/cpp/build/reference/md-mt-ld-use-run-time-library?view=vs-2017
set PATH=<protobuf_install_dir>\bin;%PATH%
set USE_MSVC_STATIC_RUNTIME=0

# Optional: Set environment variable `ONNX_ML=1` for onnx-ml

# Build ONNX
python setup.py install
```

ソースからProtobufをビルドするのではなく、conda-forgeからProtobufを使用したい場合は、以下の手順を使用することができます。

#### WindowsでAnacondaでONNXをビルドする

```
# Use conda-forge protobuf
conda install -c conda-forge numpy libprotobuf=3.11.3 protobuf

# Get ONNX
git clone https://github.com/onnx/onnx.git
cd onnx
git submodule update --init --recursive

# Set environment variable for ONNX to use protobuf shared lib
set USE_MSVC_STATIC_RUNTIME=0
set CMAKE_ARGS="-DONNX_USE_PROTOBUF_SHARED_LIBS=ON -DProtobuf_USE_STATIC_LIBS=OFF -DONNX_USE_LITE_PROTO=ON"

# Build ONNX
# Optional: Set environment variable `ONNX_ML=1` for onnx-ml

python setup.py install
```

#### ARM 64でONNXをビルド
ARM 64デバイス上でONNXを構築する場合は、依存関係を適切にインストールしてください。

```
pip install cython protobuf numpy
sudo apt-get install libprotobuf-dev protobuf-compiler
pip install onnx
```

## Verify Installation
インストール後、以下を実行します。

```
python -c "import onnx"
```

をクリックして動作を確認してください。

#### よくあるエラー
Environment variables:  `USE_MSVC_STATIC_RUNTIME` (ONでもOFFでもなく、1か0でなければなりません)

CMake variables: ONNX_USE_PROTOBUF_SHARED_LIBS`, `Protobuf_USE_STATIC_LIBS`.

ON の場合、`ONNX_USE_PROTOBUF_SHARED_LICBS`はOFF、`USE_MSVC_STATIC_RUNTIME`は0でなければならない。 
`ONNX_USE_PROTOBUF_SHARED_LIBS`がOFFの場合は、`Protobuf_USE_STATIC_LIBS`をONにし、`USE_MSVC_STATIC_RUNTIME`を1または0にする。

ソースのチェックアウトディレクトリから `import onnx` コマンドを実行しても動作しないことに注意してください。この場合、`ModuleNotFoundError: No module named 'onnx.onnx_cpp2py_export'`と表示されます。別のディレクトリに変更して、このエラーを修正してください。

UbuntuでのONNXのビルドは問題なく動作しますが、CentOS/RHELやその他のManyLinuxシステムでは、[CMakeListsファイル](https://github.com/onnx/onnx/blob/master/CMakeLists.txt#L124)を開き、`/lib`のインスタンスをすべて`/lib64`に置き換える必要があるかもしれません。

デバッグモードでONNXをビルドする場合は、環境変数 `DEBUG=1` を設定することを忘れないようにしてください。デバッグ版の依存関係には、[CMakeListsファイル](CMakeLists.txt)を開き、パッケージ名の行の最後に `d` を追加する必要がある。例えば、`NAMES protobuf-lite` は `NAMES protobuf-lite` になります。

また、Linux ベースのインストールには [onnx-dev docker image](https://hub.docker.com/r/onnx/onnx-dev) を使用することで、依存関係のバージョン管理を気にすることなくインストールすることができます。

# テスト中

ONNXでは、テストドライバとして[pytest](https://docs.pytest.org)を使用しています。テストを実行するためには、まずpytestをインストールする必要があります。

```
pip install pytest nbval
```

pytestをインストールしたら、以下のコマンドでテストを実行してください。

```
pytest
```

# 開発

使い方は [投稿者ガイド](https://github.com/onnx/onnx/blob/master/docs/CONTRIBUTING.md) をチェックしてください。

# ライセンス

[MITライセンス](LICENSE)

# 行動規範

[ONNXオープンソース行動規範](https://onnx.ai/codeofconduct.html)