nixos/ollama: split cuda and rocm from service test

Cuda and rocm are platform specific, only working on linux.
Also, ofborg won't run any of the service test at all because
cuda is unfreely licensed.
This commit is contained in:
abysssol 2024-07-13 17:26:29 -04:00
parent fdd0aa0aee
commit aa8e02582d
5 changed files with 77 additions and 42 deletions

View File

@ -685,7 +685,9 @@ in {
ocis = handleTest ./ocis.nix {}; ocis = handleTest ./ocis.nix {};
oddjobd = handleTestOn [ "x86_64-linux" "aarch64-linux" ] ./oddjobd.nix {}; oddjobd = handleTestOn [ "x86_64-linux" "aarch64-linux" ] ./oddjobd.nix {};
oh-my-zsh = handleTest ./oh-my-zsh.nix {}; oh-my-zsh = handleTest ./oh-my-zsh.nix {};
ollama = handleTest ./ollama.nix {}; ollama = runTest ./ollama.nix;
ollama-cuda = runTestOn ["x86_64-linux" "aarch64-linux"] ./ollama-cuda.nix;
ollama-rocm = runTestOn ["x86_64-linux" "aarch64-linux"] ./ollama-rocm.nix;
ombi = handleTest ./ombi.nix {}; ombi = handleTest ./ombi.nix {};
openarena = handleTest ./openarena.nix {}; openarena = handleTest ./openarena.nix {};
openldap = handleTest ./openldap.nix {}; openldap = handleTest ./openldap.nix {};

View File

@ -0,0 +1,17 @@
{ lib, ... }:
{
name = "ollama-cuda";
meta.maintainers = with lib.maintainers; [ abysssol ];
nodes.cuda =
{ ... }:
{
services.ollama.enable = true;
services.ollama.acceleration = "cuda";
};
testScript = ''
cuda.wait_for_unit("multi-user.target")
cuda.wait_for_open_port(11434)
'';
}

View File

@ -0,0 +1,17 @@
{ lib, ... }:
{
name = "ollama-rocm";
meta.maintainers = with lib.maintainers; [ abysssol ];
nodes.rocm =
{ ... }:
{
services.ollama.enable = true;
services.ollama.acceleration = "rocm";
};
testScript = ''
rocm.wait_for_unit("multi-user.target")
rocm.wait_for_open_port(11434)
'';
}

View File

@ -1,56 +1,53 @@
import ./make-test-python.nix ({ pkgs, lib, ... }: { lib, ... }:
let let
mainPort = 11434; mainPort = 11434;
altPort = 11435; altPort = 11435;
curlRequest = port: request:
"curl http://127.0.0.1:${toString port}/api/generate -d '${builtins.toJSON request}'";
prompt = {
model = "tinydolphin";
prompt = "lorem ipsum";
options = {
seed = 69;
temperature = 0;
};
};
in in
{ {
name = "ollama"; name = "ollama";
meta = with lib.maintainers; { meta.maintainers = with lib.maintainers; [ abysssol ];
maintainers = [ abysssol ];
};
nodes = { nodes = {
cpu = { ... }: { cpu =
{ ... }:
{
services.ollama.enable = true; services.ollama.enable = true;
}; };
rocm = { ... }: { altAddress =
services.ollama.enable = true; { ... }:
services.ollama.acceleration = "rocm"; {
};
cuda = { ... }: {
services.ollama.enable = true;
services.ollama.acceleration = "cuda";
};
altAddress = { ... }: {
services.ollama.enable = true; services.ollama.enable = true;
services.ollama.port = altPort; services.ollama.port = altPort;
}; };
}; };
testScript = '' testScript = ''
vms = [ cpu, rocm, cuda, altAddress ]; import json
def curl_request_ollama(prompt, port):
json_prompt = json.dumps(prompt)
return f"""curl http://127.0.0.1:{port}/api/generate -d '{json_prompt}'"""
prompt = {
"model": "tinydolphin",
"prompt": "lorem ipsum",
"options": {
"seed": 69,
"temperature": 0,
},
}
vms = [
(cpu, ${toString mainPort}),
(altAddress, ${toString altPort}),
]
start_all() start_all()
for vm in vms: for (vm, port) in vms:
vm.wait_for_unit("multi-user.target") vm.wait_for_unit("multi-user.target")
vm.wait_for_open_port(port)
stdout = cpu.succeed("""${curlRequest mainPort prompt}""", timeout=100) stdout = vm.succeed(curl_request_ollama(prompt, port), timeout = 100)
stdout = altAddress.succeed("""${curlRequest altPort prompt}""", timeout=100)
''; '';
}) }

View File

@ -212,6 +212,8 @@ goBuild ((lib.optionalAttrs enableRocm {
}; };
} // lib.optionalAttrs stdenv.isLinux { } // lib.optionalAttrs stdenv.isLinux {
inherit ollama-rocm ollama-cuda; inherit ollama-rocm ollama-cuda;
service-cuda = nixosTests.ollama-cuda;
service-rocm = nixosTests.ollama-rocm;
}; };
meta = { meta = {