Skip to content
This repository was archived by the owner on Jul 4, 2025. It is now read-only.

Commit 3d02299

Browse files
fix: install local with nvidia-driver unavailable (#1676)
* fix: install local without nvidia driver available * fix: local installer extraction * fix: set default version * chore: enable docker e2e test --------- Co-authored-by: vansangpfiev <sang@jan.ai>
1 parent a055f69 commit 3d02299

File tree

4 files changed

+110
-46
lines changed

4 files changed

+110
-46
lines changed

.github/workflows/cortex-cpp-quality-gate.yml

Lines changed: 36 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -188,40 +188,40 @@ jobs:
188188
AWS_SECRET_ACCESS_KEY: "${{ secrets.MINIO_SECRET_ACCESS_KEY }}"
189189
AWS_DEFAULT_REGION: "${{ secrets.MINIO_REGION }}"
190190

191-
# build-docker-and-test:
192-
# runs-on: ubuntu-latest
193-
# steps:
194-
# - name: Getting the repo
195-
# uses: actions/checkout@v3
196-
# with:
197-
# submodules: 'recursive'
198-
199-
# - name: Set up QEMU
200-
# uses: docker/setup-qemu-action@v3
201-
202-
# - name: Set up Docker Buildx
203-
# uses: docker/setup-buildx-action@v3
191+
build-docker-and-test:
192+
runs-on: ubuntu-latest
193+
steps:
194+
- name: Getting the repo
195+
uses: actions/checkout@v3
196+
with:
197+
submodules: 'recursive'
198+
199+
- name: Set up QEMU
200+
uses: docker/setup-qemu-action@v3
201+
202+
- name: Set up Docker Buildx
203+
uses: docker/setup-buildx-action@v3
204204

205-
# - name: Run Docker
206-
# run: |
207-
# docker build -t menloltd/cortex:test -f docker/Dockerfile .
208-
# docker run -it -d -p 3928:39281 --name cortex menloltd/cortex:test
209-
210-
# - name: use python
211-
# uses: actions/setup-python@v5
212-
# with:
213-
# python-version: "3.10"
214-
215-
# - name: Run e2e tests
216-
# run: |
217-
# cd engine
218-
# python -m pip install --upgrade pip
219-
# python -m pip install -r e2e-test/requirements.txt
220-
# pytest e2e-test/test_api_docker.py
221-
222-
# - name: Run Docker
223-
# continue-on-error: true
224-
# if: always()
225-
# run: |
226-
# docker stop cortex
227-
# docker rm cortex
205+
- name: Run Docker
206+
run: |
207+
docker build -t menloltd/cortex:test -f docker/Dockerfile .
208+
docker run -it -d -p 3928:39281 --name cortex menloltd/cortex:test
209+
210+
- name: use python
211+
uses: actions/setup-python@v5
212+
with:
213+
python-version: "3.10"
214+
215+
- name: Run e2e tests
216+
run: |
217+
cd engine
218+
python -m pip install --upgrade pip
219+
python -m pip install -r e2e-test/requirements.txt
220+
pytest e2e-test/test_api_docker.py
221+
222+
- name: Run Docker
223+
continue-on-error: true
224+
if: always()
225+
run: |
226+
docker stop cortex
227+
docker rm cortex

engine/services/engine_service.cc

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -146,9 +146,10 @@ cpp::result<bool, std::string> EngineService::UnzipEngine(
146146
CTL_INF("Found cuda variant, extract it");
147147
found_cuda = true;
148148
// extract binary
149-
auto engine_path =
150-
file_manager_utils::GetEnginesContainerPath() / engine;
151-
archive_utils::ExtractArchive(path + "/" + cf, engine_path.string());
149+
auto cuda_path =
150+
file_manager_utils::GetCudaToolkitPath(NormalizeEngine(engine));
151+
archive_utils::ExtractArchive(path + "/" + cf, cuda_path.string(),
152+
true);
152153
}
153154
}
154155
}
@@ -159,7 +160,8 @@ cpp::result<bool, std::string> EngineService::UnzipEngine(
159160

160161
auto matched_variant = GetMatchedVariant(engine, variants);
161162
CTL_INF("Matched variant: " << matched_variant);
162-
if (!found_cuda || matched_variant.empty()) {
163+
if ((!found_cuda && system_info_utils::IsNvidiaSmiAvailable()) ||
164+
matched_variant.empty()) {
163165
return false;
164166
}
165167

@@ -169,9 +171,24 @@ cpp::result<bool, std::string> EngineService::UnzipEngine(
169171
<< ", will get engine from remote");
170172
// Go with the remote flow
171173
} else {
172-
auto engine_path = file_manager_utils::GetEnginesContainerPath();
174+
auto [v, ar] = engine_matcher_utils::GetVersionAndArch(matched_variant);
175+
auto engine_path = file_manager_utils::GetEnginesContainerPath() /
176+
NormalizeEngine(engine) / ar / v;
177+
CTL_INF("engine_path: " << engine_path.string());
173178
archive_utils::ExtractArchive(path + "/" + matched_variant,
174-
engine_path.string());
179+
engine_path.string(), true);
180+
181+
auto variant =
182+
engine_matcher_utils::GetVariantFromNameAndVersion(ar, engine, v);
183+
CTL_INF("Extracted variant: " + variant.value());
184+
// set as default
185+
auto res = SetDefaultEngineVariant(engine, v, variant.value());
186+
if (res.has_error()) {
187+
CTL_ERR("Failed to set default engine variant: " << res.error());
188+
return false;
189+
} else {
190+
CTL_INF("Set default engine variant: " << res.value().variant);
191+
}
175192
}
176193

177194
return true;
@@ -295,12 +312,12 @@ cpp::result<void, std::string> EngineService::DownloadEngineV2(
295312

296313
auto variant_path = variant_folder_path / selected_variant->name;
297314
std::filesystem::create_directories(variant_folder_path);
298-
CLI_LOG("variant_folder_path: " + variant_folder_path.string());
315+
CTL_INF("variant_folder_path: " + variant_folder_path.string());
299316
auto on_finished = [this, engine, selected_variant, variant_folder_path,
300317
normalize_version](const DownloadTask& finishedTask) {
301318
// try to unzip the downloaded file
302-
CLI_LOG("Engine zip path: " << finishedTask.items[0].localPath.string());
303-
CLI_LOG("Version: " + normalize_version);
319+
CTL_INF("Engine zip path: " << finishedTask.items[0].localPath.string());
320+
CTL_INF("Version: " + normalize_version);
304321

305322
auto extract_path = finishedTask.items[0].localPath.parent_path();
306323

@@ -309,7 +326,7 @@ cpp::result<void, std::string> EngineService::DownloadEngineV2(
309326

310327
auto variant = engine_matcher_utils::GetVariantFromNameAndVersion(
311328
selected_variant->name, engine, normalize_version);
312-
CLI_LOG("Extracted variant: " + variant.value());
329+
CTL_INF("Extracted variant: " + variant.value());
313330
// set as default
314331
auto res =
315332
SetDefaultEngineVariant(engine, normalize_version, variant.value());

engine/test/components/test_engine_matcher_utils.cc

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,3 +135,27 @@ TEST_F(EngineMatcherUtilsTestSuite, TestValidate) {
135135
"cortex.llamacpp-0.1.25-25.08.24-windows-amd64-avx2.tar.gz");
136136
}
137137
}
138+
139+
TEST_F(EngineMatcherUtilsTestSuite, TestGetVersionAndArch) {
140+
{
141+
std::string variant =
142+
"cortex.llamacpp-0.1.25-25.08.24-linux-amd64-avx-cuda-11-7.tar.gz";
143+
auto [version, arch] = engine_matcher_utils::GetVersionAndArch(variant);
144+
EXPECT_EQ(version, "v0.1.25-25.08.24");
145+
EXPECT_EQ(arch, "linux-amd64-avx-cuda-11-7");
146+
}
147+
148+
{
149+
std::string variant = "cortex.llamacpp-0.1.25-windows-amd64-avx2.tar.gz";
150+
auto [version, arch] = engine_matcher_utils::GetVersionAndArch(variant);
151+
EXPECT_EQ(version, "v0.1.25");
152+
EXPECT_EQ(arch, "windows-amd64-avx2");
153+
}
154+
155+
{
156+
std::string variant = "cortex.llamacpp-0.1.25-25.08.24-mac-amd64.tar.gz";
157+
auto [version, arch] = engine_matcher_utils::GetVersionAndArch(variant);
158+
EXPECT_EQ(version, "v0.1.25-25.08.24");
159+
EXPECT_EQ(arch, "mac-amd64");
160+
}
161+
}

engine/utils/engine_matcher_utils.h

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,4 +172,27 @@ inline std::string Validate(const std::vector<std::string>& variants,
172172

173173
return cuda_compatible;
174174
}
175+
176+
inline std::pair<std::string, std::string> GetVersionAndArch(
177+
const std::string& file_name) {
178+
// Remove the file extension
179+
std::string base = file_name.substr(0, file_name.find("tar") - 1);
180+
181+
size_t arch_pos = 0;
182+
if (base.find("windows") != std::string::npos) {
183+
arch_pos = base.find("-windows");
184+
} else if (base.find("linux") != std::string::npos) {
185+
arch_pos = base.find("-linux");
186+
} else {
187+
arch_pos = base.find("-mac");
188+
}
189+
190+
// Extract architecture part
191+
auto arch = base.substr(arch_pos + 1);
192+
193+
// Extract version part
194+
size_t v_pos = base.find_first_of('-');
195+
auto version = base.substr(v_pos + 1, arch_pos - v_pos - 1);
196+
return std::pair("v" + version, arch);
197+
}
175198
} // namespace engine_matcher_utils

0 commit comments

Comments
 (0)