5. よくある質問
5.1. MLSDK について
5.1.1. MLSDK を導入するとは具体的に何を指すのか
まず、PyTorch で記述された計算処理を関数として括りだし、計算処理の入出力を Mapping[str, torch.Tensor] の型で表現します。次にその関数を mlsdk.Context の API を使ってコンパイルし、コンパイル済み関数を取得します。その関数はコンパイル元と同様に呼び出すことが出来るため、元の関数と置き換えれば導入は完了です。
具体的な手順については、 はじめに を参照してください。
5.1.2. MLSDK を導入したプログラムは GPU で動くのか
結論から言うと動作します。MLSDK を導入すると、元の PyTorch で記述されたプログラムは FX2ONNX + PFVM の環境で計算グラフとして表現され、それを処理する環境には MN-Core 2 の他にも CPU や GPU (CUDA) が選択できます。そのため、一度 MN-Core 2 で動くようにしたプログラムも GPU で同様に動かすことができます。
また、計算グラフに変換する過程で Common Subexpression Elimination などの最適化が入るため、基本的に元のプログラムよりもメモリ効率や実行速度に観点で有利になります。もちろんこの過程で計算結果が変わることはありません。
具体的な切替方法については、 Ecosystem を参照してください。
5.2. よくあるエラーと対処法
MLSDK を利用してエラーが発生した場合、大まかに以下の3種に分けられます。
デバイス本体、もしくはランタイム内部のエラー
MLSDK API のエラー
コンパイル中のエラー
5.2.1. デバイス本体、もしくはランタイム内部のエラー
gpfn3-smi list に何も出力されない
システム側が MN-Core 2 ボードを認識しておらず、ワークスペースの再作成、もしくはシステムの再起動 (DevKit のみ) が必要かもしれません。ワークスペースを作成する際に、デバイス要求数を1以上に設定されているか確認してください。
MLSDK がデバイスのロックに失敗する
MN-Core 2 を使うプログラムがハングした場合、内部でデバイスのロックに失敗している可能性があります。他に MN-Core 2 を使うプログラムがいないことを確認し、 gpfn3-smi reset <device> を試してください。
警告
別のプログラムがロックしているデバイスをリセットした場合、そのプログラムの進捗が失われる可能性があります。
QFAIL in DeviceProcessor at ...: Failed to allocate XXth IDMA chunk
MLSDK のランタイムが DMA 用の pinned memory の確保に失敗しています。多くの場合プログラムの再実行で解消されますが、問題が頻発する場合は報告をお願いします。
5.2.2. MLSDK API のエラー
ModuleNotFoundError: No module named 'mlsdk'
環境変数 PYTHONPATH が正しく設定されていません。サンプルプログラムを実行する を参考に必要な環境変数を設定してください。
AssertionError: ... is not in inputs.
CompiledFunction の期待する入力が全て揃っていません。CompiledFunctionを呼び出す も参照してください。
what(): shape '[...]' is invalid for input of size ...
CompiledFunction の受け取った入力がコンパイル時と異なる次元になっています。CompiledFunctionを呼び出す も参照してください。
また、学習ループの終了直前にこの問題が発生する場合、 drop_last が適切に設定されていない可能性があります。この場合は drop_lastの指定 を参照してください。
同じ処理でも実行のたびにコンパイルが走ってしまう
Context.compile へ cache_options を指定することでコンパイル結果の再利用ができます。関数のコンパイル も参照してください。
Check `is_tmp_region_safe' failed! in RunTasks
MLSDK ランタイム内部の実行キューに多くのタスクが入ったことにより、メモリが足らなくなってしまった状態です。Context.synchronize や TensorProxy.cpu を適度に挟むことにより解決します。
5.2.3. コンパイル中のエラー
google.protobuf.message.DecodeError: Error parsing message with type 'onnx.ModelProto'
出力する ONNX が大きくなる場合に発生します。以下の環境変数を設定して再実行してください。
$ export MNCORE_USE_EXTERNAL_DATA_FORMAT=1
また、以下のコンパイルオプションを Context.compile に設定することでも出力する ONNX のサイズを小さくできます。これにより Python backtrace の情報を ONNX 中に埋め込まなくなります。
options={"strip_doc_string": True},
TileGrad for dynamic input shape is not supported
環境変数 MNCORE_USE_LEGACY_ONNX_EXPORTER=1 が設定されており、ONNX の出力に FX2ONNX ではなく Torch のものが使われていることが原因です。以下の環境変数を設定して再実行してください。
$ export MNCORE_USE_LEGACY_ONNX_EXPORTER=0
emit_code/emit_mncore_code 中に OOM でプログラムが終了する
同時に走るコンパイルスレッドが過剰なため、ホスト側のメモリを使いすぎている状況です。スレッド数 (デフォルトではシステムの認識する CPU 数) をコンパイルオプション num_threads や環境変数 CODEGEN_NUM_THREADS で設定することにより、OOM を回避できます。スレッド数はコンパイル速度とのトレードオフになるため、以下の例では1を設定していますが、適切な数を設定してください。
options={"num_threads": 1},
$ export CODEGEN_NUM_THREADS=1