コンテンツにスキップ

C API

ONNX Runtime C APIは、ONNXモデルをスコアリングするためのネイティブAPIです。 APIはinclude/onnxruntime/core/session/onnxruntime_c_api.hにあります。

これは、APIを使用してONNXモデルをスコアリングする方法を示す簡単な使用例です。完全なコードはこちらです。

#include <onnxruntime_c_api.h>
const OrtApi* g_ort = OrtGetApiBase()->GetApi(ORT_API_VERSION);
// ONNX Runtimeエラーチェック用のマクロ
#define ORT_ABORT_ON_ERROR(expr) \
do { \
OrtStatus* onnx_status = (expr); \
if (onnx_status != NULL) { \
const char* msg = g_ort->GetErrorMessage(onnx_status); \
fprintf(stderr, "%s\n", msg); \
g_ort->ReleaseStatus(onnx_status); \
abort(); \
} \
} while (0);
int main(int argc, char* argv[]) {
// 環境の初期化
OrtEnv* env;
ORT_ABORT_ON_ERROR(g_ort->CreateEnv(ORT_LOGGING_LEVEL_WARNING, "test", &env));
// セッションオプションの初期化
OrtSessionOptions* session_options;
ORT_ABORT_ON_ERROR(g_ort->CreateSessionOptions(&session_options));
// モデルのロードとセッションの作成
const char* model_path = "model.onnx";
OrtSession* session;
ORT_ABORT_ON_ERROR(g_ort->CreateSession(env, model_path, session_options, &session));
// 入力テンソルの作成
OrtMemoryInfo* memory_info;
ORT_ABORT_ON_ERROR(g_ort->CreateCpuMemoryInfo(OrtArenaAllocator, OrtMemTypeDefault, &memory_info));
const int64_t input_shape[] = {1, 3, 224, 224};
const size_t input_shape_len = sizeof(input_shape) / sizeof(input_shape[0]);
const size_t model_input_len = 1 * 3 * 224 * 224;
float model_input[model_input_len];
// 入力データを初期化
// ...
OrtValue* input_tensor;
ORT_ABORT_ON_ERROR(g_ort->CreateTensorWithDataAsOrtValue(
memory_info, model_input, model_input_len * sizeof(float), input_shape, input_shape_len, ONNX_TENSOR_ELEMENT_DATA_TYPE_FLOAT, &input_tensor));
// 推論の実行
const char* input_names[] = {"input"};
const char* output_names[] = {"output"};
OrtValue* output_tensor = NULL;
ORT_ABORT_ON_ERROR(g_ort->Run(session, NULL, input_names, (const OrtValue* const*)&input_tensor, 1, output_names, 1, &output_tensor));
// 出力の取得
float* output_data;
ORT_ABORT_ON_ERROR(g_ort->GetTensorMutableData(output_tensor, (void**)&output_data));
// 出力の処理
// ...
// クリーンアップ
g_ort->ReleaseValue(output_tensor);
g_ort->ReleaseValue(input_tensor);
g_ort->ReleaseSession(session);
g_ort->ReleaseSessionOptions(session_options);
g_ort->ReleaseEnv(env);
return 0;
}

OrtApi構造体は、ONNX Runtime C APIのメインエントリポイントです。すべてのAPI関数へのポインタが含まれています。

OrtEnvオブジェクトは、ONNX Runtime環境を表します。これは、ロギングやスレッド処理などのグローバル状態を管理します。

OrtSessionOptionsオブジェクトは、セッションの作成時に使用されるオプションを構成するために使用されます。これらのオプションには、実行プロバイダー、スレッド処理オプション、およびその他の設定が含まれます。

OrtSessionオブジェクトは、ONNXモデルを表します。モデルのロード、入力のバインド、および推論の実行に使用されます。

OrtValueオブジェクトは、ONNX Runtimeのテンソルを表します。入力および出力データの保持に使用されます。

OrtMemoryInfoオブジェクトは、メモリ割り当てに関する情報を提供します。これは、CPUまたはGPUメモリにテンソルを作成するために使用できます。

ONNX Runtimeは、推論を並列化するために複数のスレッドを使用できます。スレッドの数は、OrtSessionOptionsオブジェクトを使用して設定できます。

// 2つのスレッドを使用するようにセッションを設定
g_ort->SetIntraOpNumThreads(session_options, 2);

ONNX Runtimeは、さまざまなハードウェアアクセラレータで推論を実行するための実行プロバイダー(EP)をサポートしています。EPは、OrtSessionOptionsオブジェクトを使用して有効にできます。

// CUDA実行プロバイダーを有効にする
OrtCUDAProviderOptions cuda_options;
g_ort->SessionOptionsAppendExecutionProvider_CUDA(session_options, &cuda_options);

ONNX Runtimeは、カスタム演算子をサポートしています。カスタム演算子は、OrtSessionOptionsオブジェクトを使用して登録できます。

// カスタム演算子ライブラリを登録
g_ort->RegisterCustomOpsLibrary(session_options, "custom_op_library.so", NULL);