Fine-tune
There are two paths. Path A runs the OpenJevX fine-tuning pipeline yourself. Path B runs a SageMaker training job in your own AWS account with jev-train. Both start from the same CSV.
Read this first
Section titled “Read this first”Two limits apply to both paths today. Read them before you rent a GPU.
Warning: where training starts. In the openjevx pipeline,
task alldoes not yet start from the checkpoint, so every run trains from the base model. 1 In the SageMaker training image, the defaultbase_modelisconvaiinnovations/laya. 2 3
Path A: each run saves a trainable checkpoint next to the model, but
task alldoes not yet start from it, so today every run trains from the base model on the whole mix. 1
The SageMaker training image takes ONE customer’s
decisions.csvand builds shards from those rows only. 4
Path B: the openjevx code runs unchanged from the pinned tag
v0.5.0. 5
SageMaker job minimum: a CSV needs ≥ 50 train rows for smoke and ≥ 34 for full. 6 openjevx’s own
examples/decisions.csvhas 53 train rows since 2026-10-03; the 39-row version before it (24 train rows) failed both. 7 By the same ×2 / ×3 repeats that is 106 (smoke) and 159 (full) items, above 100, computed fromvalidate’s split and not yet measured by a dry run. 8 jev-cloud shipsclient/examples/decisions.csv; its test asserts it validates, has enough train rows for both smoke and full, and has held-out gate rows. 9
The old 39-row example’s dry run failed: 48 items < 100. 10
Your data as a CSV
Section titled “Your data as a CSV”One row is one decision: put the fact the rule needs in the state, ask the question, give the right answer. 11
Add near-miss rows around each threshold (499 / 500 / 501) so the model learns the line, not the topic. 12
The file is UTF-8, comma-separated, with a header row. 13
| Column | Required | What it holds |
|---|---|---|
state |
yes | the facts, as a JSON object or plain text, e.g. {"order_total_rs": 501} 14 |
question |
yes | The instruction, for example “Does the order get the discount? Orders over Rs 500 get 10% off.” 15 |
type |
no (default noul) |
noul (yes/no), choice or score. 16 |
options |
for choice and score | the option names, as a|b|c or a=what a means|b=... 17 |
answer |
yes | noul: yes/no/true/false/1/0; choice: an option name; score: a level name or index (0 = lowest). 18 |
split |
no | train, test or gate; empty means 90% train / 10% gate, fixed per row. 19 |
source |
no (default your-data) |
A tag for where the row came from. 20 |
options is a|b|c or a=what a means|b=...; score levels go lowest first; for noul, leave it empty or give true=...|false=.... 17
An empty split defaults to 90% train / 10% gate, fixed by a hash of state+question. 21
jev-train also accepts yes/no, yesno, bool and boolean as noul. 22 23
JSON inside a CSV cell: wrap the cell in double quotes and double the quotes inside, as in "{""day"": ""Friday""}". 24
A state that starts with { must be valid JSON and a non-empty object; anything else is plain text. 25
A cell that contains a comma must be quoted, or the row has more cells than the header. 26
Quality rules
Section titled “Quality rules”- Aim for 20+ rows per question. 27
- Keep no single answer above 80%. 27
validatereports both as warnings: fewer than 20 rows for a question, or one answer above 80%. 28- Two rows with the same state and question but different answers are an error: a fact that decides the answer is missing from the state. 29
- Never put the answer in the state (
"eligible": true). 30 - Keep a few of the hardest rows as
split=gate, so you can measure the result. 31
The row the trainer sees
Section titled “The row the trainer sees”Training rows have the shape {state, questions:{id:{type: noul|choice|score, instructions, criteria}}, gold}. 32
New domain data must already be state + questions + gold.probabilities; hard labels alone are not an RLCD target. 33
The gold field holds full probability distributions. 34
Path A: do it yourself
Section titled “Path A: do it yourself”1. Import the CSV
Section titled “1. Import the CSV”python finetuning/dataprep/import_csv.py yours.csv --name mydata --add-to-configThe importer writes <data>/train/NAME_train.jsonl, <data>/eval/NAME_eval.jsonl and <data>/gate/NAME_gate.jsonl. 35
It refuses to write if any row is bad, unless --skip-bad. 36
--dry-run checks without writing. 37
--add-to-config adds your train file to the training mix (repeated 3 times; change with --repeat), your gate file to the gate, and both to the leakage check. 38
2. Where settings and data live
Section titled “2. Where settings and data live”Settings live in ~/.config/openjevx/config.json, created from finetuning/config.example.json; override the path with $OPENJEVX_FT_CONFIG. 39
Data lives in ~/openjevx/data/; override it with $OPENJEVX_DATA. 40
The data folder holds raw/, incoming/, train/, eval/, gate/ and work/{leak,shards,runs,gate,quality,samples}. 41
3. The stages of ft.py
Section titled “3. The stages of ft.py”One runner, ft.py, drives every stage, and every step fails loudly. 42 43
| Command | What it does |
|---|---|
ft.py dataprep |
Generates the rule-labelled sets into <data>/{train,eval,gate}. 44 |
ft.py validate |
Adapter dry-parse plus leakage check; fails if a gate question asks about a state that is in training. 45 |
ft.py package [--smoke] |
Builds the shard in <data>/work/shards/<version>[-smoke]/ and runs every row through the trainer’s build_item on CPU. 46 |
ft.py train [--smoke] |
Runs the shard on config.provider and gets the 8-bit ONNX back. 47 |
ft.py gate MODEL |
Serves MODEL locally, scores it, and exits 1 if it misses the config thresholds. 48 |
ft.py all |
Every step in order, with a smoke run before the full run. 49 |
The same stages run from the Taskfile in finetuning/: task all, task smoke, task train, task gate -- <model folder>. 50
cd finetuningtask alltask all runs dataprep → validate → smoke → full train → gate, stopping at the first failure. 51
4. The one-job GPU run
Section titled “4. The one-job GPU run”Every run is one job, end to end: data ready → validate (leakage check) → smoke run → full run → gate. 52
Freeze the data before renting a GPU; a model ships only when the gate passes, not when training ends. 53
config.example.json sets the provider to vast with GPU RTX_4090. 54
The laptop uploads the shard to the private bucket openjevx-train and a job.env holding only signed links and the kill token. 55
The box uses pytorch/pytorch:2.6.0-cuda12.4-cudnn9-runtime and installs the packages in finetuning/train/requirements-box.txt from PyPI. 56
The box trains, calibrates, exports ONNX on CUDA, quantizes to 8-bit, and fails if the 8-bit ONNX is over 750 MB. 57
It uploads openjevx.w8.onnx, checkpoint.tar.gz, eval_report.json, job.log and status.json to runs/<run>/ through signed PUT links. 58
The laptop only waits on R2: gpu/vast.py polls runs/<run>/status.json and downloads the results to ~/openjevx/data/work/runs/<run>/out/. 59
A run survives the laptop sleeping or the agent session ending; results wait in R2. 60
task cloud-setup creates or refreshes the private R2 bucket and the self-destroy endpoint, and checks it. 61
The box clones a pushed commit, so commit and push any change under finetuning/ before training. 62
From a fork, origin must be a public repo you can push to, because the box clones it over HTTPS with no credentials. 63
Another GPU provider is one file, finetuning/gpu/<name>.py, that prints RUN_DIR=<dir> and leaves the model folder in <dir>/out/model/. 64
On your own CUDA box, run the steps in finetuning/ft.py and finetuning/train/run_job.sh directly. 65
The training box must use onnxruntime-gpu==1.22.0; version 1.30 needs CUDA 13 and silently falls back to CPU on this image. 66
5. The release gate
Section titled “5. The release gate”python3 ft.py gate ~/openjevx/data/work/runs/<run>/out/modelThreshold (config gate) |
Default |
|---|---|
min_basics_confident_right |
0.9 67 |
max_basics_confident_wrong |
0.02 68 |
min_jevx13_correct |
12 69 |
The gate also scores the logs gate and the held-out test sets, and nothing may regress against the previous release. 70
Right & confident means right and sure enough to act on: yes ≥ 0.8, no ≤ 0.2, a choice or score ≥ 0.6. 71
Confidently wrong means sure and wrong; keep it near zero. 72
The full report is saved to ~/openjevx/data/work/gate/<model>.json. 73
Honest limit: a small gate file is noisy. A CSV with ~15 held-out rows gives a very noisy accuracy, so add
split=testrows. 74
Path B: SageMaker with jev-train
Section titled “Path B: SageMaker with jev-train”jev-train validates your CSV on your machine, uploads it to an S3 bucket in your account, starts a SageMaker training job in your account, and watches it to the end. 75
validate uses exactly the rules of the OpenJevX importer the trainer uses. 76
It needs Node 20 or newer. 77
Credentials come from the AWS SDK default chain only, and jev-train never asks for keys and never prints them. 78
Commands
Section titled “Commands”jev-train validate decisions.csvjev-train upload decisions.csv --bucket my-jev-models [--job NAME]jev-train start --bucket my-jev-models --role-arn arn:aws:iam::123456789012:role/JevTraining \ --image 123456789012.dkr.ecr.us-east-1.amazonaws.com/jev-train:v0.5.0 \ [--job NAME] [--instance ml.g4dn.xlarge] [--spot] [--max-hours 3] [--smoke]jev-train status jev-20261002-101500jev-train watch jev-20261002-101500 [--interval 30]jev-train run decisions.csv --bucket ... --role-arn ... --image ... [start options]| Command | What it does |
|---|---|
validate <csv> |
Local only; prints every bad row with its line number and a fix, then rows and answers per question, with warnings below 20 rows or above 80% for one answer. 28 |
upload <csv> --bucket B |
Validates first, then uploads to s3://B/training/<job>/input/decisions.csv. 79 |
start |
Calls CreateTrainingJob. 80 |
status <job> |
Prints the status, the secondary status and the billable seconds. 81 |
watch <job> |
Polls every --interval seconds (30 by default); Ctrl-C stops watching and the job keeps running. 82 |
run <csv> |
validate, upload, start, watch. 83 |
--stack NAME reads the defaults from a CloudFormation stack’s outputs: ModelsBucket, TrainingRoleArn and TrainingImage. 84
Any flag you pass overrides the stack’s value. 85
Upload layout
Section titled “Upload layout”The job name defaults to jev-YYYYMMDD-HHMMSS (UTC). 79
| S3 path | What |
|---|---|
s3://B/training/<job>/input/decisions.csv |
the customer CSV, uploaded by the jev client after local validation 86 87 |
s3://B/training/<job>/output/model.tar.gz |
SageMaker’s own output. 86 88 |
s3://B/models/current/ |
What the server loads. 89 |
s3://B/models/<version>/ |
Every trained or delivered version, immutable once written. 90 91 |
The job runs on --instance (default ml.g4dn.xlarge), 1 instance, 50 GB volume. 92
The hyperparameter shard is smoke with --smoke, otherwise full. 93
The default base model is baked into the image, so the job runs with HF_HUB_OFFLINE=1; any other base_model repo is downloaded at train time and needs network access. 3
The container contract
Section titled “The container contract”| Part | Path | Notes |
|---|---|---|
| command | docker run <image> train |
Any other argument prints usage and exits 2. 94 |
| input | /opt/ml/input/data/train/decisions.csv |
Channel train; if decisions.csv is missing, the only *.csv in the channel is used. 95 |
| hyperparameters | /opt/ml/input/config/hyperparameters.json |
All values are strings. 96 |
| model output | /opt/ml/model/ → S3OutputPath/<job>/output/model.tar.gz |
Files at the root of the tar. 97 |
| checkpoint | /opt/ml/output/data/checkpoint/ |
The trainable checkpoint for a later re-fine-tune, kept out of the model tar. 98 |
| failure | /opt/ml/output/failure + non-zero exit |
SageMaker shows it as FailureReason. 99 |
| logs | stdout → CloudWatch | CSV contents are never logged. 100 |
model.tar.gz holds openjevx.w8.onnx, config.json, tokenizer.json, eval_report.json and manifest.json, all at the root. 101
| Hyperparameter | Default | Meaning |
|---|---|---|
shard |
smoke |
smoke: 1 epoch, micro-batch 2, accuracy gate 0.0; full: 4 epochs, micro 8 × accum 8, gate 0.55. 102 |
base_model |
convaiinnovations/laya |
A Hugging Face repo in laya layout. 3 |
max_w8_mb |
750 |
Fail if the 8-bit ONNX is larger, in MiB. 103 |
dry_run |
0 |
1 stops before GPU training. 104 |
A dry run needs no GPU, so a cheap CPU instance (ml.m5.large) can check the data first. 105
Minimum rows
Section titled “Minimum rows”The job needs at least 34 rows in the train split for a full run, or 50 for --smoke. 106
The reason: train_job.py raises below 100 trainable items, and the smoke shard holds your train rows ×2 and the full shard ×3. 107
A full run also needs held-out rows (split test or gate). 108
Warning: the container has not run on a GPU yet. The runtime figures in its README are estimates, not measurements. 109
On a T4, do not set AMP=bf16. 110
Promote the result
Section titled “Promote the result”A model is one folder: openjevx.w8.onnx (8-bit weight-only graph), config.json and tokenizer.json. 111
The job produces the model folder <run>/out/model/ with that run’s calibration temperatures; set "model" in openjevx.json to it. 112
{ "listen": "127.0.0.1:21118", "device": "auto", "model": "/path/to/my-model" }GET /health reports version and sha256, so you can check which model is live. 113
On S3, promote means copying the 3 files of models/<version>/ into models/current/; a server ETag reload or a rolling restart picks it up. 114
Rollback means promoting the previous version again. 115
Deploy under a new model name (mymodel-v2), so no cached answer from the old model is reused. 116
Problems on the way: see Troubleshooting. Terms: see Glossary.
Sources
Section titled “Sources”Footnotes
Section titled “Footnotes”-
openjevx @ v0.5.9 (ee2a1f4) ·
docs/book/train-your-own-jev.mdL299–300 ↩ ↩2 -
jev-cloud @ origin/main (10a744c) ·
train/sagemaker/README.mdL1 ↩ -
jev-cloud @ origin/main (10a744c) ·
train/sagemaker/README.mdL47 ↩ ↩2 ↩3 -
jev-cloud @ origin/main (10a744c) ·
train/sagemaker/README.mdL3–5 ↩ -
jev-cloud @ origin/main (10a744c) ·
train/sagemaker/README.mdL9–10 ↩ -
jev-cloud @ origin/main (10a744c) ·
train/sagemaker/README.mdL65–66 ↩ -
jev-cloud @ origin/main (10a744c) ·
train/sagemaker/README.mdL66–68 ↩ -
jev-cloud @ origin/main (10a744c) ·
train/sagemaker/README.mdL107–108 ↩ -
jev-cloud @ origin/main (10a744c) ·
client/test/example.test.jsL8–15 ↩ -
jev-cloud @ origin/main (10a744c) ·
train/sagemaker/README.mdL100–102 ↩ -
openjevx @ v0.5.9 (ee2a1f4) ·
finetuning/examples/README.mdL10 ↩ -
openjevx @ v0.5.9 (ee2a1f4) ·
finetuning/examples/README.mdL11 ↩ -
openjevx @ v0.5.9 (ee2a1f4) ·
finetuning/dataprep/import_csv.pyL6 ↩ -
openjevx @ v0.5.9 (ee2a1f4) ·
finetuning/examples/README.mdL15 ↩ -
openjevx @ v0.5.9 (ee2a1f4) ·
finetuning/examples/README.mdL16 ↩ -
openjevx @ v0.5.9 (ee2a1f4) ·
finetuning/examples/README.mdL17 ↩ -
openjevx @ v0.5.9 (ee2a1f4) ·
finetuning/examples/README.mdL18 ↩ ↩2 -
openjevx @ v0.5.9 (ee2a1f4) ·
finetuning/examples/README.mdL19 ↩ -
openjevx @ v0.5.9 (ee2a1f4) ·
finetuning/examples/README.mdL20 ↩ -
openjevx @ v0.5.9 (ee2a1f4) ·
finetuning/examples/README.mdL21 ↩ -
openjevx @ v0.5.9 (ee2a1f4) ·
finetuning/dataprep/import_csv.pyL14 ↩ -
jev-cloud @ origin/main (10a744c) ·
client/README.mdL1 ↩ -
jev-cloud @ origin/main (10a744c) ·
client/README.mdL79 ↩ -
openjevx @ v0.5.9 (ee2a1f4) ·
finetuning/examples/README.mdL23–24 ↩ -
jev-cloud @ origin/main (10a744c) ·
client/README.mdL87–88 ↩ -
jev-cloud @ origin/main (10a744c) ·
client/README.mdL89 ↩ -
openjevx @ v0.5.9 (ee2a1f4) ·
finetuning/examples/README.mdL26 ↩ ↩2 -
jev-cloud @ origin/main (10a744c) ·
client/README.mdL42 ↩ ↩2 -
jev-cloud @ origin/main (10a744c) ·
client/README.mdL90–91 ↩ -
openjevx @ v0.5.9 (ee2a1f4) ·
docs/book/train-your-own-jev.mdL122 ↩ -
openjevx @ v0.5.9 (ee2a1f4) ·
docs/book/train-your-own-jev.mdL121 ↩ -
openjevx @ v0.5.9 (ee2a1f4) ·
README.mdL250 ↩ -
openjevx @ v0.5.9 (ee2a1f4) ·
docs/adr/0001-base-model.mdL22 ↩ -
openjevx @ v0.5.9 (ee2a1f4) ·
docs/adr/0002-training-run.mdL14 ↩ -
openjevx @ v0.5.9 (ee2a1f4) ·
finetuning/dataprep/import_csv.pyL17 ↩ -
openjevx @ v0.5.9 (ee2a1f4) ·
finetuning/dataprep/import_csv.pyL18 ↩ -
openjevx @ v0.5.9 (ee2a1f4) ·
docs/book/train-your-own-jev.mdL144 ↩ -
openjevx @ v0.5.9 (ee2a1f4) ·
docs/book/train-your-own-jev.mdL144–146 ↩ -
openjevx @ v0.5.9 (ee2a1f4) ·
AGENTS.mdL7–8 ↩ -
openjevx @ v0.5.9 (ee2a1f4) ·
AGENTS.mdL9 ↩ -
openjevx @ v0.5.9 (ee2a1f4) ·
AGENTS.mdL9–10 ↩ -
openjevx @ v0.5.9 (ee2a1f4) ·
finetuning/ft.pyL2 ↩ -
openjevx @ v0.5.9 (ee2a1f4) ·
finetuning/ft.pyL8–16 ↩ -
openjevx @ v0.5.9 (ee2a1f4) ·
finetuning/ft.pyL8 ↩ -
openjevx @ v0.5.9 (ee2a1f4) ·
finetuning/ft.pyL9–10 ↩ -
openjevx @ v0.5.9 (ee2a1f4) ·
finetuning/ft.pyL11–12 ↩ -
openjevx @ v0.5.9 (ee2a1f4) ·
finetuning/ft.pyL13 ↩ -
openjevx @ v0.5.9 (ee2a1f4) ·
finetuning/ft.pyL14–15 ↩ -
openjevx @ v0.5.9 (ee2a1f4) ·
finetuning/ft.pyL16 ↩ -
openjevx @ v0.5.9 (ee2a1f4) ·
AGENTS.mdL6 ↩ -
openjevx @ v0.5.9 (ee2a1f4) ·
finetuning/Taskfile.ymlL28–30 ↩ -
openjevx @ v0.5.9 (ee2a1f4) ·
AGENTS.mdL20 ↩ -
openjevx @ v0.5.9 (ee2a1f4) ·
AGENTS.mdL20–21 ↩ -
openjevx @ v0.5.9 (ee2a1f4) ·
finetuning/config.example.jsonL3–6 ↩ -
openjevx @ v0.5.9 (ee2a1f4) ·
docs/adr/0009-one-job-gpu-run-via-r2.mdL21–24 ↩ -
openjevx @ v0.5.9 (ee2a1f4) ·
docs/adr/0009-one-job-gpu-run-via-r2.mdL25–27 ↩ -
openjevx @ v0.5.9 (ee2a1f4) ·
docs/adr/0009-one-job-gpu-run-via-r2.mdL31–32 ↩ -
openjevx @ v0.5.9 (ee2a1f4) ·
docs/adr/0009-one-job-gpu-run-via-r2.mdL32–34 ↩ -
openjevx @ v0.5.9 (ee2a1f4) ·
docs/adr/0009-one-job-gpu-run-via-r2.mdL39–40 ↩ -
openjevx @ v0.5.9 (ee2a1f4) ·
docs/adr/0009-one-job-gpu-run-via-r2.mdL60 ↩ -
openjevx @ v0.5.9 (ee2a1f4) ·
finetuning/Taskfile.ymlL7–9 ↩ -
openjevx @ v0.5.9 (ee2a1f4) ·
docs/book/train-your-own-jev.mdL186–187 ↩ -
openjevx @ v0.5.9 (ee2a1f4) ·
docs/book/train-your-own-jev.mdL189–191 ↩ -
openjevx @ v0.5.9 (ee2a1f4) ·
docs/book/train-your-own-jev.mdL198–199 ↩ -
openjevx @ v0.5.9 (ee2a1f4) ·
README.mdL255–256 ↩ -
openjevx @ v0.5.9 (ee2a1f4) ·
docs/adr/0002-training-run.mdL18 ↩ -
openjevx @ v0.5.9 (ee2a1f4) ·
finetuning/config.example.jsonL140 ↩ -
openjevx @ v0.5.9 (ee2a1f4) ·
finetuning/config.example.jsonL141 ↩ -
openjevx @ v0.5.9 (ee2a1f4) ·
finetuning/config.example.jsonL142 ↩ -
openjevx @ v0.5.9 (ee2a1f4) ·
docs/RELEASE_PROCESS.mdL77–79 ↩ -
openjevx @ v0.5.9 (ee2a1f4) ·
docs/book/train-your-own-jev.mdL217 ↩ -
openjevx @ v0.5.9 (ee2a1f4) ·
docs/book/train-your-own-jev.mdL219 ↩ -
openjevx @ v0.5.9 (ee2a1f4) ·
docs/book/train-your-own-jev.mdL223 ↩ -
jev-cloud @ origin/main (10a744c) ·
train/sagemaker/README.mdL151–152 ↩ -
jev-cloud @ origin/main (10a744c) ·
client/README.mdL5–9 ↩ -
jev-cloud @ origin/main (10a744c) ·
client/README.mdL5–6 ↩ -
jev-cloud @ origin/main (10a744c) ·
client/README.mdL15 ↩ -
jev-cloud @ origin/main (10a744c) ·
client/README.mdL23–24 ↩ -
jev-cloud @ origin/main (10a744c) ·
client/README.mdL43 ↩ ↩2 -
jev-cloud @ origin/main (10a744c) ·
client/README.mdL44 ↩ -
jev-cloud @ origin/main (10a744c) ·
client/README.mdL45 ↩ -
jev-cloud @ origin/main (10a744c) ·
client/README.mdL46 ↩ -
jev-cloud @ origin/main (10a744c) ·
client/README.mdL47 ↩ -
jev-cloud @ origin/main (10a744c) ·
client/README.mdL49–50 ↩ -
jev-cloud @ origin/main (10a744c) ·
client/README.mdL50 ↩ -
jev-cloud @ origin/main (10a744c) ·
docs/model-s3-contract.mdL5 ↩ ↩2 -
jev-cloud @ origin/main (10a744c) ·
docs/model-s3-contract.mdL16–17 ↩ -
jev-cloud @ origin/main (10a744c) ·
docs/model-s3-contract.mdL16–18 ↩ -
jev-cloud @ origin/main (10a744c) ·
docs/model-s3-contract.mdL8 ↩ -
jev-cloud @ origin/main (10a744c) ·
docs/model-s3-contract.mdL6–7 ↩ -
jev-cloud @ origin/main (10a744c) ·
docs/model-s3-contract.mdL12 ↩ -
jev-cloud @ origin/main (10a744c) ·
client/README.mdL58 ↩ -
jev-cloud @ origin/main (10a744c) ·
client/README.mdL60 ↩ -
jev-cloud @ origin/main (10a744c) ·
train/sagemaker/README.mdL20 ↩ -
jev-cloud @ origin/main (10a744c) ·
train/sagemaker/README.mdL21 ↩ -
jev-cloud @ origin/main (10a744c) ·
train/sagemaker/README.mdL22 ↩ -
jev-cloud @ origin/main (10a744c) ·
train/sagemaker/README.mdL24 ↩ -
jev-cloud @ origin/main (10a744c) ·
train/sagemaker/README.mdL25 ↩ -
jev-cloud @ origin/main (10a744c) ·
train/sagemaker/README.mdL26 ↩ -
jev-cloud @ origin/main (10a744c) ·
train/sagemaker/README.mdL27 ↩ -
jev-cloud @ origin/main (10a744c) ·
train/sagemaker/README.mdL29–37 ↩ -
jev-cloud @ origin/main (10a744c) ·
train/sagemaker/README.mdL46 ↩ -
jev-cloud @ origin/main (10a744c) ·
train/sagemaker/README.mdL48 ↩ -
jev-cloud @ origin/main (10a744c) ·
train/sagemaker/README.mdL49 ↩ -
jev-cloud @ origin/main (10a744c) ·
train/sagemaker/README.mdL86–87 ↩ -
jev-cloud @ origin/main (10a744c) ·
client/README.mdL94–95 ↩ -
jev-cloud @ origin/main (10a744c) ·
train/sagemaker/README.mdL64–66 ↩ -
jev-cloud @ origin/main (10a744c) ·
train/sagemaker/README.mdL69 ↩ -
jev-cloud @ origin/main (10a744c) ·
train/sagemaker/README.mdL123 ↩ -
jev-cloud @ origin/main (10a744c) ·
train/sagemaker/README.mdL117 ↩ -
openjevx @ v0.5.9 (ee2a1f4) ·
docs/RELEASE_PROCESS.mdL61–64 ↩ -
openjevx @ v0.5.9 (ee2a1f4) ·
README.mdL257–259 ↩ -
openjevx @ v0.5.9 (ee2a1f4) ·
docs/book/train-your-own-jev.mdL264–265 ↩ -
jev-cloud @ origin/main (10a744c) ·
docs/model-s3-contract.mdL20–21 ↩ -
jev-cloud @ origin/main (10a744c) ·
docs/model-s3-contract.mdL21 ↩ -
openjevx @ v0.5.9 (ee2a1f4) ·
docs/book/train-your-own-jev.mdL302 ↩