Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
7032c6b
Path updates to remove environment
Dec 10, 2025
42661d2
Add comprehensive notebook testing framework
Dec 10, 2025
f56dd69
Fix notebook testing framework and verify it works
Dec 10, 2025
f4a8a5d
Fix remaining path issues in FT-Qwen3-1.7B-chess.ipynb
Dec 11, 2025
4ef0a0a
updating pat from neuron-workshops to BOT
Dec 30, 2025
3356519
Merge branch 'aws-neuron:main' into add-notebook-testing
jimburtoft Jan 13, 2026
591f1a0
moving from neuron-workshops to build-on-trainium-workshop path
Jan 13, 2026
cb7d6a2
Merge branch 'aws-neuron:main' into add-notebook-testing
jimburtoft Jan 15, 2026
33ba028
Update model paths to use home directory shortcuts
jimburtoft Jan 15, 2026
e4c177e
Update output directory path for finetuning
jimburtoft Jan 15, 2026
7864f85
Update Finetune-Qwen3-1.7B.ipynb
jimburtoft Jan 15, 2026
bbfb8fa
Update model path to full directory in notebook
jimburtoft Jan 15, 2026
a906831
Update fine-tuned model path in notebook
jimburtoft Jan 15, 2026
e1a5055
Update fine-tuned model path in notebook
jimburtoft Jan 15, 2026
59088c7
Fix print statement to include training job name
jimburtoft Jan 15, 2026
6a0d9a2
Update README_TESTING with testing status note
jimburtoft Jan 15, 2026
d681627
Rename TESTING.md to tests/TESTING.md
jimburtoft Jan 15, 2026
88d9747
Rename requirements-test.txt to tests/requirements-test.txt
jimburtoft Jan 15, 2026
c6b9152
Rename test_notebooks.py to tests/test_notebooks.py
jimburtoft Jan 15, 2026
5742b53
Update and rename run_tests.sh to tests/run_tests.sh
jimburtoft Jan 15, 2026
b20bf95
Rename pytest.ini to tests/pytest.ini
jimburtoft Jan 15, 2026
3beb176
Add files via upload
jimburtoft Jan 15, 2026
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
127 changes: 127 additions & 0 deletions .github/workflows/test-notebooks.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
name: Test Notebooks

on:
push:
branches: [ main, develop ]
pull_request:
branches: [ main ]
schedule:
# Run tests weekly to catch SDK updates
- cron: '0 6 * * 1' # Monday at 6 AM UTC

jobs:
test-notebooks:
runs-on: ubuntu-latest

# This job runs on Trainium instances with Neuron SDK

strategy:
matrix:
notebook-group:
- "NxD"
- "FineTuning"
- "vLLM"
- "NKI"
fail-fast: false

steps:
- name: Checkout repository
uses: actions/checkout@v4

- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.10'

- name: Install test dependencies
run: |
pip install -r requirements-test.txt

- name: Validate notebook syntax (without execution)
run: |
# Just validate that notebooks are well-formed JSON
python -c "
import json
from pathlib import Path

notebooks = list(Path('labs/${{ matrix.notebook-group }}').rglob('*.ipynb'))
print(f'Validating {len(notebooks)} notebooks in ${{ matrix.notebook-group }}')

for nb_path in notebooks:
if '.ipynb_checkpoints' in str(nb_path):
continue
try:
with open(nb_path) as f:
json.load(f)
print(f'✓ {nb_path}')
except Exception as e:
print(f'✗ {nb_path}: {e}')
exit(1)
"

- name: Check for required files
run: |
# Verify that notebooks reference existing files
python -c "
import json
from pathlib import Path
import re

def check_notebook_references(nb_path):
with open(nb_path) as f:
nb = json.load(f)

issues = []
for cell in nb.get('cells', []):
if cell.get('cell_type') == 'code':
source = ''.join(cell.get('source', []))

# Check for file references
file_refs = re.findall(r'[\"\']([\w\./\-]+\.(?:txt|py|json|yaml|yml|sh))[\"\'']', source)
for file_ref in file_refs:
if not file_ref.startswith('/') and not Path(nb_path.parent / file_ref).exists():
issues.append(f'Missing file reference: {file_ref}')

return issues

notebooks = list(Path('labs/${{ matrix.notebook-group }}').rglob('*.ipynb'))
all_issues = []

for nb_path in notebooks:
if '.ipynb_checkpoints' in str(nb_path):
continue
issues = check_notebook_references(nb_path)
if issues:
all_issues.extend([f'{nb_path}: {issue}' for issue in issues])

if all_issues:
print('Found issues:')
for issue in all_issues:
print(f' {issue}')
# Don't fail on missing files for now, just warn
# exit(1)
else:
print('No file reference issues found')
"

# Full notebook execution on Trainium instances
test-execution:
runs-on: self-hosted # Trainium instance with Neuron SDK
needs: test-notebooks
if: github.event_name == 'push' || github.event_name == 'schedule'

steps:
- name: Checkout repository
uses: actions/checkout@v4

- name: Run notebook tests
run: |
# Run on actual Trainium hardware with Neuron SDK
./run_tests.sh --fast --html-report

- name: Upload test results
uses: actions/upload-artifact@v3
if: always()
with:
name: test-results-${{ matrix.notebook-group }}
path: test_report.html
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@
"metadata": {},
"outputs": [],
"source": [
"%cd /home/ubuntu/environment/FineTuning/HuggingFaceExample/01_finetuning/assets\n",
"%cd /home/ubuntu/build-on-trainium-workshop/labs/FineTuning/HuggingFaceExample/01_finetuning/assets\n",
"%pip install -q -r requirements.txt\n"
]
},
Expand Down Expand Up @@ -95,7 +95,7 @@
" finetune_chess_model.py \\\n",
" --model_id Qwen/Qwen3-1.7B \\\n",
" --tokenizer_id Qwen/Qwen3-1.7B \\\n",
" --output_dir ~/environment/ml/qwen-chess \\\n",
" --output_dir ~/ml/qwen-chess \\\n",
" --bf16 True \\\n",
" --gradient_checkpointing True \\\n",
" --gradient_accumulation_steps 1 \\\n",
Expand Down Expand Up @@ -128,11 +128,11 @@
"outputs": [],
"source": [
"!optimum-cli export neuron \\\n",
" --model /home/ubuntu/environment/ml/qwen-chess/merged_model \\\n",
" --model ~/ml/qwen-chess/merged_model \\\n",
" --task text-generation \\\n",
" --sequence_length 2048 \\\n",
" --batch_size 4 \\\n",
" /home/ubuntu/environment/ml/qwen-chess/compiled_model\n"
" ~/ml/qwen-chess/compiled_model\n"
]
},
{
Expand Down Expand Up @@ -163,7 +163,7 @@
"from vllm import LLM, SamplingParams\n",
"\n",
"llm = LLM(\n",
" model=\"/home/ubuntu/environment/ml/qwen-chess/compiled_model\", #local compiled model\n",
" model=\"/home/ubuntu/ml/qwen-chess/compiled_model\", #full path to local compiled model\n",
" max_num_seqs=4,\n",
" max_model_len=2048,\n",
" device=\"neuron\",\n",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@
"metadata": {},
"outputs": [],
"source": [
"%cd /home/ubuntu/environment/FineTuning/HuggingFaceExample/01_finetuning/assets\n",
"%cd /home/ubuntu/build-on-trainium-workshop/labs/FineTuning/HuggingFaceExample/01_finetuning/assets\n",
"%pip install -r requirements.txt"
]
},
Expand Down Expand Up @@ -79,7 +79,7 @@
" finetune_model.py \\\n",
" --model_id Qwen/Qwen3-1.7B \\\n",
" --tokenizer_id Qwen/Qwen3-1.7B \\\n",
" --output_dir ~/environment/ml/qwen \\\n",
" --output_dir ~/ml/qwen \\\n",
" --bf16 True \\\n",
" --gradient_checkpointing True \\\n",
" --gradient_accumulation_steps 1 \\\n",
Expand Down Expand Up @@ -112,11 +112,11 @@
"outputs": [],
"source": [
"!optimum-cli export neuron \\\n",
" --model /home/ubuntu/environment/ml/qwen/merged_model \\\n",
" --model ~/ml/qwen/merged_model \\\n",
" --task text-generation \\\n",
" --sequence_length 512 \\\n",
" --batch_size 1 \\\n",
" /home/ubuntu/environment/ml/qwen/compiled_model"
" ~/ml/qwen/compiled_model"
]
},
{
Expand Down Expand Up @@ -146,7 +146,7 @@
"import os\n",
"from vllm import LLM, SamplingParams\n",
"llm = LLM(\n",
" model=\"/home/ubuntu/environment/ml/qwen/compiled_model\", #local compiled model\n",
" model=\"/home/ubuntu/ml/qwen/compiled_model\", #local compiled model\n",
" max_num_seqs=1,\n",
" max_model_len=2048,\n",
" device=\"neuron\",\n",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -200,7 +200,7 @@
"s3_output_path=f\"{s3_orig_model_path}compiled_model/\"\n",
"print(\"s3_output_path\",s3_output_path)\n",
"training_job_name = utils.name_from_base(\"TGICompilation\")\n",
"print(\"training_job_name\")\n",
"print(\"training_job_name\",training_job_name)\n",
"s3_model_path = f\"{s3_orig_model_path}merged_model/\"\n",
"print(\"s3_model_path\",s3_model_path)\n",
"\n",
Expand Down
6 changes: 3 additions & 3 deletions labs/NxD/Lab_One_NxDI.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@
"metadata": {},
"outputs": [],
"source": [
"!hf download NousResearch/Llama-3.2-1B --local-dir /home/ubuntu/environment/models/llama/"
"!hf download NousResearch/Llama-3.2-1B --local-dir /home/ubuntu/build-on-trainium-workshop/labs/models/llama/"
]
},
{
Expand All @@ -101,7 +101,7 @@
"outputs": [],
"source": [
"# the original checkpoint\n",
"model_path = '/home/ubuntu/environment/models/llama/'"
"model_path = '/home/ubuntu/build-on-trainium-workshop/labs/models/llama/'"
]
},
{
Expand All @@ -112,7 +112,7 @@
"outputs": [],
"source": [
"# where your NxD trace will go\n",
"traced_model_path = '/home/ubuntu/environment/models/traced_llama'"
"traced_model_path = '/home/ubuntu/build-on-trainium-workshop/labs/models/traced_llama'"
]
},
{
Expand Down
14 changes: 7 additions & 7 deletions labs/vLLM/Chess/Chess-Deployment.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@
"import os\n",
"\n",
"# Option 1: Use your fine-tuned model (update path if you completed fine-tuning lab)\n",
"FINE_TUNED_MODEL_PATH = \"/home/ubuntu/environment/ml/qwen-chess/compiled_model\" # default path from previous lab\n",
"FINE_TUNED_MODEL_PATH = \"/home/ubuntu/ml/qwen-chess/compiled_model\" # default path from previous lab\n",
"\n",
"# Option 2: Use pre-compiled model from HF repository (default), this will be pulled down by optimum-neuron-vllm\n",
"PRECOMPILED_MODEL_PATH = \"kunhunjon/ChessLM_Qwen3_Trainium_AWS_Format\"\n",
Expand Down Expand Up @@ -171,7 +171,7 @@
"metadata": {},
"outputs": [],
"source": [
"%cd /home/ubuntu/environment/vLLM/Chess/assets/\n",
"%cd /home/ubuntu/build-on-trainium-workshop/labs/vLLM/Chess/assets/\n",
"# Update vllm.sh with correct model path\n",
"import os\n",
"import re\n",
Expand Down Expand Up @@ -210,7 +210,7 @@
"nohup bash vllm.sh > vllm-server.log 2>&1 &\n",
"\n",
"echo \"Server starting (PID: $!)\"\n",
"echo \"Check logs from /home/ubuntu/environment: tail -f vLLM/Chess/assets/vllm-server/vllm-server.log\"\n"
"echo \"Check logs from /home/ubuntu/build-on-trainium-workshop/labs: tail -f vLLM/Chess/assets/vllm-server/vllm-server.log\"\n"
]
},
{
Expand All @@ -221,7 +221,7 @@
"\n",
"You can monitor the server logs in the terminal:\n",
"```bash\n",
"tail -f /home/ubuntu/environment/vLLM/Chess/assets/vllm-server/vllm-server.log\n",
"tail -f /home/ubuntu/build-on-trainium-workshop/labs/vLLM/Chess/assets/vllm-server/vllm-server.log\n",
"```\n",
"\n",
"Or check Neuron core usage:\n",
Expand Down Expand Up @@ -299,7 +299,7 @@
"outputs": [],
"source": [
"# copy your env vars in\n",
"%cd /home/ubuntu/environment/vLLM/Chess/assets/\n",
"%cd /home/ubuntu/build-on-trainium-workshop/labs/vLLM/Chess/assets/\n",
"! cp env.example .env\n"
]
},
Expand All @@ -313,7 +313,7 @@
"%load_ext dotenv\n",
"\n",
"# 2. Load your .env file (adjust path if needed!)\n",
"%dotenv /home/ubuntu/environment/vLLM/Chess/assets/.env"
"%dotenv /home/ubuntu/build-on-trainium-workshop/labs/vLLM/Chess/assets/.env"
]
},
{
Expand Down Expand Up @@ -347,7 +347,7 @@
"metadata": {},
"outputs": [],
"source": [
"%cd /home/ubuntu/environment/vLLM/Chess/\n",
"%cd /home/ubuntu/build-on-trainium-workshop/labs/vLLM/Chess/\n",
"\n",
"from assets.agents.vllm_agent import VLLMAgent\n",
"from assets.agents.stockfish_agent import StockfishAgent\n",
Expand Down
6 changes: 3 additions & 3 deletions labs/vLLM/Chess/Chess-Tournament.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@
"outputs": [],
"source": [
"# copy your env vars in\n",
"%cd /home/ubuntu/environment/vLLM/Chess/assets/\n",
"%cd /home/ubuntu/build-on-trainium-workshop/labs/vLLM/Chess/assets/\n",
"! cp env.example .env\n"
]
},
Expand All @@ -87,7 +87,7 @@
"%load_ext dotenv\n",
"\n",
"# 2. Load your .env file (adjust path if needed!)\n",
"%dotenv /home/ubuntu/environment/vLLM/Chess/assets/.env"
"%dotenv /home/ubuntu/build-on-trainium-workshop/labs/vLLM/Chess/assets/.env"
]
},
{
Expand Down Expand Up @@ -123,7 +123,7 @@
"metadata": {},
"outputs": [],
"source": [
"%cd /home/ubuntu/environment/vLLM/Chess/\n",
"%cd /home/ubuntu/build-on-trainium-workshop/labs/vLLM/Chess/\n",
"\n",
"# Play single game: vLLM vs Stockfish (skill 5)\n",
"!python -m assets.run_game \\\n",
Expand Down
2 changes: 1 addition & 1 deletion labs/vLLM/Chess/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ Learn how to:

```bash
# Navigate to lab directory
cd /home/ubuntu/environment/neuron-workshops/labs/vLLM/Chess
cd /home/ubuntu/build-on-trainium-workshop/labs/vLLM/Chess

#install stockfish
sudo apt install stockfish
Expand Down
Loading