Slides, the demo notebooks and the GPU job:
Site locations from the NRP dashboard, 10 Nov 2026
Not drawn: 8 sites in Hawaii, Guam, Korea, Brazil and Europe
Container image
built once, from a Dockerfile
Kubernetes cluster
the scheduler picks a node with a free GPU
kubectl apply -f job.yamlNo login node and no batch queue: pick the door that matches how much infrastructure you want to touch.
Most people start with JupyterHub or the hosted LLMs.
from openai import OpenAIclient = OpenAI(base_url="https://ellm.nrp-nautilus.io/v1", api_key=TOKEN) # from nrp.ai/llmtokenclient.chat.completions.create(model="gpt-oss", messages=[{"role": "user", "content": "Hi"}])
In the browser at nrp-openwebui.nrp-nautilus.io, or from any code that speaks the OpenAI API
Your jobs
$ kubectl apply -f sweep/job.batch/train-lr-0.1 createdjob.batch/train-lr-0.01 createdjob.batch/train-lr-0.001 created$ kubectl get podsNAME READY STATUS RESTARTS AGEtrain-lr-0.1-7xkqp 1/1 Running 0 40strain-lr-0.01-m4q9d 1/1 Running 0 40strain-lr-0.001-c8w3n 0/1 Pending 0 40s$ kubectl get podsNAME READY STATUS RESTARTS AGEtrain-lr-0.1-7xkqp 0/1 Completed 0 3m10strain-lr-0.01-m4q9d 1/1 Running 0 3m10strain-lr-0.001-c8w3n 1/1 Running 0 3m10s
GPU node · 4 × A10
GPU node · 4 × RTX 3090
lr-0.001 waits in Pending until a GPU frees up; a finished job releases its GPU
public datasets, simulations, benchmark and synthetic data
if your IRB and data use agreement allow it
PHI or identifiable patient data, including in LLM prompts
Good uses
model development and training · image analysis · simulation · teaching · LLMs on non-sensitive text
Also not for: commercial work, or services that need guaranteed uptime (it is a shared, best-effort cluster)
NRP is not HIPAA compliant. Keep PHI in UCLA Health's approved environments.
1. Log in at nrp.ai
Log In → CILogon → choose UCLA → your UCLA login
2. Get into a namespace
Request one at get-started.nrp-nautilus.io
Or ask an existing namespace admin to add you
3. Start working
JupyterHub, kubectl, or an LLM token from nrp.ai/llmtoken
Who can request a namespace: faculty, staff, postdocs and research scientists. Students: your PI or instructor requests it and adds you.
Nautilus cluster
lab-smithbio-courseanother-labkubectl + ~/.kube/config1. Install kubectl and the kubelogin plugin
2. Download your config from nrp.ai/config, save it as ~/.kube/config
3. Run any kubectl command: a browser opens for the UCLA login
4. Work in your namespace
On the training JupyterHub this is already set up.
# one-time setupmkdir -p ~/.kubecurl -o ~/.kube/config -fSL https://nrp.ai/config # first command: a browser opens for CILogonkubectl get pods -n my-labNo resources found in my-lab namespace. # make my-lab your default namespacekubectl config set contexts.nautilus.namespace my-lab
1,411 GPUs across 33 models
| GPU memory | Examples | Good for | How to ask |
|---|---|---|---|
| Up to 16 GB | RTX 2080 Ti, GTX 1080 Ti, A4000, A100 slices | Teaching, debugging, classic ML, small CNNs | nvidia.com/gpu: 1 |
| 20–24 GB | A10, RTX 3090, L4, RTX 4090 | Most deep learning; fine-tuning and serving models up to ~8B parameters | nvidia.com/gpu: 1 + memory or model |
| 32–48 GB | L40, V100 32 GB, RTX A6000, A40 | Bigger models and batches; serving models up to ~30B | nvidia.com/gpu, or rtxa6000 / a40 |
| 80 GB and up | A100 80 GB, H100, H200 | Large training runs and large models | A100: access request; H100/H200 reserved |
Current PyTorch builds need Turing or newer: on a GTX 1080 Ti or V100, use an older image.
Interactive: JupyterHub
Interactive: a pod
Long-running: a Deployment
Batch: a Job
$ kubectl apply -f sweep/ # six training jobsSix jobs on four GPUs: two wait in Pending and take the first GPUs that free up. When the last one ends, all four GPUs are free again.
1. Pick a GPU
2. Your notebook runs on it
$ kubectl apply -f pod.yamlpod/dev-pod created$ kubectl exec -it dev-pod -- bashroot@dev-pod:/# nvidia-smi -LGPU 0: NVIDIA A10 (UUID: GPU-…)root@dev-pod:/# python test.py
Deployment web-app · 2 replicas
web-app-5d59d-x2kqpRunningweb-app-5d59d-m4q9dRunningweb-app-5d59d-m4q9dcrashedweb-app-5d59d-c8w3nRunningKubernetes keeps two copies running; when one crashes, it starts a replacement
apiVersion: batch/v1kind: Jobmetadata: {name: gpu-train-daniel, namespace: my-lab} # (1)spec: template: spec: restartPolicy: Never containers: - name: train image: pytorch/pytorch:2.9.0-cuda13.0-cudnn9-runtime # (2) command: ["python", "train.py"] resources: # (3) requests: {cpu: "2", memory: 6Gi, nvidia.com/gpu: 1} limits: {cpu: "2", memory: 6Gi, nvidia.com/gpu: 1} affinity: # (4) nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - {key: nvidia.com/gpu.memory, operator: Gt, values: ["20000"]} - {key: nvidia.com/gpu.compute.major, operator: Gt, values: ["7"]}
(1) Where: your namespace
(2) What: a container image, and the command to run
(3) Resources: 2 CPUs, 6 GB of memory, one GPU
(4) Which GPU: more than 20 GB, Ampere or newer; or name exact models
# submitkubectl apply -f gpu-job.yaml # watch: Pending → Running → Completedkubectl get pods -l job-name=gpu-train-daniel # read the outputkubectl logs -f job/gpu-train-daniel # clean upkubectl delete job gpu-train-daniel
Stuck in Pending? kubectl describe pod says why, usually that no matching GPU is free.
Our test: under 30 s from submit to done on an A10 that had the image; several minutes in Pending when the cluster was full.
Running on: NVIDIA A10Matrix multiply, 4096 x 4096: CPU (2 cores) 0.09 TFLOP/s GPU 14.0 TFLOP/s (154x)Training on 60,000 images, testing on 10,000epoch 1: loss 0.090, accuracy 98.4%, 1.6 sepoch 2: loss 0.009, accuracy 98.7%, 1.0 sepoch 3: loss 0.033, accuracy 98.7%, 1.1 sDone: the job exits and frees the GPU.
Do
priorityClassName: opportunistic, and checkpointDon't
sleep in a Job to keep a GPU (bannable)| Model | Good for |
|---|---|
| qwen3, qwen3-small | Hard reasoning, long documents, images |
| gpt-oss | General chat, reproducible research |
| glm-5, kimi, minimax | Agentic coding |
| deepseek-v4-flash | Whole codebases, very long documents |
| gemma, gemma-small | Images, video, audio transcription |
| qwen3-embedding | Search and RAG (embeddings) |
Uses from the models page, 26 Oct 2026. The catalog rotates.
Claude Code on NRP's gpt-oss, asked about the demo's GPU job
opencode on NRP's qwen3, same question
%%ai openai-chat:gpt-ossHere is a summary of my dataset: {summary}Which columns would you check first, and why?
Worked examples: the PEARC26 tutorial (serving, RAG), and a physics neural network trained in GPU jobs (CMS HATS)
| Your class needs | A hub on NRP gives it |
|---|---|
| The same environment for every student | A container image you choose |
| No laptop setup on day one | JupyterLab in the browser, with campus login |
| GPUs for a neural-network unit | GPU options on the start menu, with limits |
| An AI assistant, without per-seat fees | Jupyter AI and the hosted LLMs, preconfigured |
| Shared datasets and notebooks | One shared volume in every server |
1. Log in: nrp.ai (CILogon → UCLA)
2. Request a namespace: get-started.nrp-nautilus.io
PIs, faculty, staff, postdocs; students ask their PI
3. Try the LLMs: nrp-openwebui.nrp-nautilus.io
4. Run your first GPU job:
training.nrp-nautilus.io/ucla-health
Help
Daniel Diaz · d4diaz@ucsd.edu