Een script lokaal testen¶
Een script draait op het platform in een sandbox die start vanuit één openbare image. Je kunt die image ophalen en je script erin draaien op je eigen machine, zonder netwerk zoals op het platform, voordat je een versie registreert. Wat daar draait is wat het platform draait: dezelfde Python en Node.js, dezelfde bibliotheken in dezelfde versies (Wat de sandbox-image meebrengt).
Een lokale test controleert je programma. Hij test niet het schema van de argumenten, de limieten van je sleutel of de bestanden die een beurt meestuurt; roep het script daarvoor rechtstreeks aan zodra de versie is geregistreerd.
Wat je nodig hebt¶
- Docker, of een ander hulpmiddel dat OCI-images draait.
- De release die je platform draait. Elke release publiceert zijn sandbox-image als
ghcr.io/artific-ai/artific-core/sandbox:<versie>, bijvoorbeeldsandbox:1.42.0. De versie is deinfo.versiondie/api/openapi.jsonvan je installatie meldt (Versies). Je hoeft je niet aan te melden om de image op te halen.
IMAGE=ghcr.io/artific-ai/artific-core/sandbox:<versie>
docker pull "$IMAGE"
Is er onder die versie geen image gepubliceerd, dan draait je platform een build van vóór zijn
release, zoals een testomgeving. Vraag je operator dan om de exacte image,
ghcr.io/artific-ai/artific-core/sandbox@sha256:<digest>, en gebruik die op dezelfde manier als
IMAGE.
Om te controleren dat je de image hebt opgehaald die je platform draait, vergelijk je de
Python-bibliotheken erin met de pypi-pakketten die GET /packages teruggeeft met
approval: image. De lijst noemt ook pip zelf: dat is het installatieprogramma van de image en
staat niet op die lijst:
docker run --rm "$IMAGE" python3 -m pip list --format=freeze
De image is gebouwd voor Linux op x86-64. Op een machine met een andere processor, zoals een Mac
met Apple silicon, voeg je --platform linux/amd64 toe aan elk docker-commando op deze pagina.
Het script draaien¶
Draai vanuit de map waarin je entrypoint staat. Het commando koppelt die map als /workspace en
draait het script daar. Op het platform draait een script in een eigen map onder /workspace;
relatieve paden naar zijn eigen bestanden werken in beide gevallen hetzelfde. Schrijf alleen onder
/workspace: het platform kan elk ander pad alleen-lezen maken. Het commando geeft het script wat
een aanroep het geeft
(Wat het script meekrijgt): de argumenten op standaardinvoer
en in het bestand dat ARTIFIC_ARGUMENTS noemt, en een map voor de bestanden die het teruggeeft.
echo '{"slides": ["Plan", "Budget"]}' > arguments.json
mkdir -p out
docker run --rm -i --network none \
-v "$PWD:/workspace" \
-e ARTIFIC_ARGUMENTS=/workspace/arguments.json \
-e ARTIFIC_OUTPUTS=/workspace/out \
"$IMAGE" python3 main.py < arguments.json
Voor een entrypoint in Node.js eindig je het commando met node index.js. De bestanden die het
script schreef staan in out/, en wat het op standaarduitvoer en standaardfout afdrukte is wat het model leest
(Wat een aanroep doet). mkdir -p out laat de bestanden van
een eerdere test staan; Core maakt de map voor elke aanroep leeg.
Een script dat de bijlagen van een beurt leest, vindt ze onder ARTIFIC_INPUTS, als
<bestands-id>/<bestandsnaam>. Zet testbestanden in inputs/<bestands-id>/<bestandsnaam> naast je
entrypoint en voeg -e ARTIFIC_INPUTS=/workspace/inputs toe aan het commando.
| Deel van het commando | Waarom |
|---|---|
--network none |
de sandbox heeft geen netwerk; een script dat er een nodig heeft, faalt hier zoals op het platform |
-v "$PWD:/workspace" |
het script draait in zijn eigen map, als gewone gebruiker, niet als root, met /workspace als thuismap |
-i en < arguments.json |
de argumenten komen binnen op standaardinvoer |
De image draait als gebruiker met id 1000. Is je eigen gebruikers-id op Linux een ander, dan kan
het script niet in de gekoppelde map schrijven; voeg --user "$(id -u):$(id -g)" toe.
Met pakketten die je hebt goedgekeurd¶
Een bibliotheek die niet in de image zit, bereikt een script als
goedgekeurd pakket: een wheel of een npm-tarball, in de sandbox
geïnstalleerd vanuit het bestand, offline. Doe lokaal hetzelfde met de bestanden die je ter
goedkeuring zou uploaden, met elke afhankelijkheid die niet in de image zit. Zet de wheels in
wheels/ en de tarballs in tarballs/ naast je entrypoint.
Python:
docker run --rm --network none -v "$PWD:/workspace" "$IMAGE" sh -c '
python3 -m pip install --no-index --no-deps --no-compile --no-cache-dir \
--disable-pip-version-check --quiet --target .packages/python ./wheels/*.whl &&
PYTHONPATH=.packages/python python3 main.py'
Node.js:
docker run --rm --network none -v "$PWD:/workspace" "$IMAGE" sh -c '
npm install --offline --ignore-scripts --no-bin-links --no-audit --no-fund --no-save \
--no-package-lock --cache /workspace/.packages/.npm-cache \
--prefix .packages/node ./tarballs/*.tgz &&
NODE_PATH=.packages/node/node_modules:/opt/artific/node/node_modules node index.js'
Dit zijn de installatiecommando's die Core bij een aanroep draait, met dezelfde opties. Door
--no-deps en --offline wordt niets opgezocht of opgehaald: een afhankelijkheid die je wegliet, faalt bij de import of
require van het script zelf, hier zoals op het platform. Schrijf ./tarballs/, met ./ ervoor;
npm leest een kale tarballs/naam.tgz als een repository op GitHub. Voeg de delen -i, -e en
< arguments.json uit Het script draaien toe wanneer het script argumenten
leest.
Een lokale test laat bestanden in je map achter die niet van het script zijn: arguments.json,
out/, inputs/, .packages/, en verborgen mappen (met een punt ervoor) die bibliotheken in de thuismap schrijven,
zoals .cache/ en .config/. Registreer alleen de eigen bestanden van het script.
Als een lokale test afwijkt¶
| Wat je ziet | Oorzaak |
|---|---|
ModuleNotFoundError of Cannot find module voor een bibliotheek die op de referentiepagina staat |
de image die je ophaalde is niet de image die je platform draait; haal de tag op van de release die je platform draait |
| dezelfde fout voor een andere bibliotheek | hij zit niet in de image: keur hem goed en installeer hem zoals hierboven |
No matching distribution found of een wheel die "not a supported wheel on this platform" is |
de wheel is gebouwd voor een ander platform of een andere Python dan die van de sandbox (Runtimes) |
Permission denied bij het schrijven van een bestand |
je gebruikers-id is niet 1000; voeg --user "$(id -u):$(id -g)" toe |