Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 23 additions & 0 deletions src/models/session_options.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@

#include "session_options.h"

#include <algorithm>
#include <cctype>
#include <functional>
#include <unordered_map>

Expand Down Expand Up @@ -173,6 +175,27 @@ DeviceInterface* SetProviderSessionOptions(OrtSessionOptions& session_options,
}

for (const auto& provider : providers_list) {
// CPU EP is always implicitly registered and cannot be appended via
// ORT's AppendExecutionProvider API. Throw if users attempt to set
// CPU-specific provider options (which would be silently lost), but
// accept bare "cpu" as a no-op for backward compatibility.
{
std::string lower_provider(provider);
std::transform(lower_provider.begin(), lower_provider.end(), lower_provider.begin(),
[](unsigned char c) { return static_cast<unsigned char>(std::tolower(c)); });
if (lower_provider == "cpu" || lower_provider == "cpuexecutionprovider") {
auto provider_options_it = std::find_if(provider_options_list.begin(), provider_options_list.end(),
[&provider](const Config::ProviderOptions& po) { return po.name == provider; });
if (provider_options_it != provider_options_list.end() && !provider_options_it->options.empty()) {
throw std::runtime_error(
"CPU execution provider does not support provider options. "
"CPU is always available as the default fallback and does not need to be explicitly registered. "
"Remove the CPU provider entry and its options from your configuration.");
}
continue;
}
}

auto provider_options_it = std::find_if(provider_options_list.begin(), provider_options_list.end(),
[&provider](const Config::ProviderOptions& po) { return po.name == provider; });

Expand Down
25 changes: 25 additions & 0 deletions test/c_api_tests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,31 @@ TEST(CAPITests, Config) {
#endif
}

// Regression test: appending CPU provider should not throw.
// See https://github.com/microsoft/onnxruntime-genai/pull/2179
TEST(CAPITests, AppendCpuProvider) {
#if TEST_PHI2
auto config = OgaConfig::Create(PHI2_PATH);
config->ClearProviders();
config->AppendProvider("cpu");
auto model = OgaModel::Create(*config);
ASSERT_NE(model.get(), nullptr);

// Also test other case variants
auto config2 = OgaConfig::Create(PHI2_PATH);
config2->ClearProviders();
config2->AppendProvider("CPU");
auto model2 = OgaModel::Create(*config2);
ASSERT_NE(model2.get(), nullptr);

auto config3 = OgaConfig::Create(PHI2_PATH);
config3->ClearProviders();
config3->AppendProvider("CPUExecutionProvider");
auto model3 = OgaModel::Create(*config3);
ASSERT_NE(model3.get(), nullptr);
#endif
}

TEST(CAPITests, TokenizerCAPI) {
#if TEST_PHI2
auto config = OgaConfig::Create(PHI2_PATH);
Expand Down
Loading