Skip to content

Need help - C++ ONNX Failing #24476

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
kleingeo opened this issue Apr 19, 2025 · 0 comments
Open

Need help - C++ ONNX Failing #24476

kleingeo opened this issue Apr 19, 2025 · 0 comments

Comments

@kleingeo
Copy link

Describe the issue

I am trying to get a sklearn model from Python into C++. On the C++ side, I have no idea what I am doing. The Python can be seen below and runs without any issues.

import numpy as np
np.random.seed(0)
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC

iris = load_iris()
X, y = iris.data, iris.target
X = X.astype(np.float32)
X_train, X_test, y_train, y_test = train_test_split(X, y)
clr = SVC()
clr.fit(X_train, y_train)

# Convert into ONNX format.
from skl2onnx import to_onnx, convert_sklearn
from skl2onnx.common.data_types import FloatTensorType, Int64TensorType


model_name = "test_model.onnx"

initial_types = [("input", FloatTensorType(X.shape[1:]))]

onx = convert_sklearn(clr, 'test_svc',
                      initial_types=initial_types)

with open(model_name, "wb") as f:
    f.write(onx.SerializeToString())

import onnxruntime as rt

sess = rt.InferenceSession(model_name, providers=["CPUExecutionProvider"])
input_name = sess.get_inputs()[0].name
label_name = [sess.get_outputs()[0].name, sess.get_outputs()[1].name]
pred_onx = sess.run(label_name, {input_name: X_test[0]})
print(pred_onx)
>>> [array([2]), array([[-0.24219441,  1.1082064 ,  2.228405  ]], dtype=float32)]

The C++ code fails and I truly have no idea why.

#include <iostream>
#include <sstream>
#include <string>
#include <vector>
#include <onnxruntime_cxx_api.h>


int main(int argc) {

    std::array<float, 4> input_arr { 5.8f, 2.8f, 5.1f, 2.4f };
    std::array<int64_t, 1> input_shape{ 4, };
    std::vector<const char*> output_node_names = { "label", "probabilities" };

    std::vector<int> input_dims = { 4, };

    constexpr int32_t input_size = 4;

    const wchar_t* model_file = L"C:/test_sklearn_onnx/test_model.onnx";

    // onnxruntime setup
    Ort::Env env(ORT_LOGGING_LEVEL_WARNING, "test_onnx");
    Ort::SessionOptions session_options;
    Ort::Session session = Ort::Session(env, model_file, session_options);

    auto memory_info = Ort::MemoryInfo::CreateCpu(OrtArenaAllocator, OrtMemTypeDefault);

    Ort::Value input_tensor = Ort::Value::CreateTensor<float>(memory_info,
        input_arr.data(), input_arr.size(),
        input_shape.data(), input_shape.size());

    std::vector<const char*> input_node_names = { "input" };

    auto output_tensors = session.Run(Ort::RunOptions{ nullptr }, input_node_names.data(), &input_tensor, 1, output_node_names.data(), 4);

}

To reproduce

Run the same code again.

Urgency

No response

Platform

Windows

OS Version

Windows 11

ONNX Runtime Installation

Released Package

ONNX Runtime Version or Commit ID

1.21.0

ONNX Runtime API

C++

Architecture

X64

Execution Provider

Default CPU

Execution Provider Library Version

No response

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant