The National Research Platform
for AI-Enabled Research
GPUs and AI for research and education
Daniel Diaz · San Diego Supercomputer Center, UC San Diego
UCLA Health IT Research Tech Talk · 10 November 2026

Agenda

  • What is NRP?
  • Getting access, and what a namespace is
  • GPUs: what's available, and how to run a GPU job
  • AI services: hosted LLMs and Jupyter AI
  • JupyterHub for labs and classes
  • Live demo
  • Questions

Slides, the demo notebooks and the GPU job:

San Diego Supercomputer Center2

The Platform

San Diego Supercomputer Center3

What is NRP?

  • A national Kubernetes cluster, Nautilus, for research and education
  • Run by SDSC (UC San Diego), Nebraska–Lincoln and MGHPCC; funded by NSF
  • Hardware contributed by 70+ institutions, UCLA among them
  • Scale today:
  • 536 nodes
  • 1,411 GPUs in 33 models
  • Petabytes of storage
  • Free for non-commercial research and education
UCLAUC San DiegoNebraska–LincolnMGHPCC

Site locations from the NRP dashboard, 10 Nov 2026
Not drawn: 8 sites in Hawaii, Guam, Korea, Brazil and Europe

San Diego Supercomputer Center4

Kubernetes and Containers

  • Container image: your code plus everything it needs (Python, PyTorch, CUDA), in one package
  • Runs the same on a laptop, a cluster or the cloud
  • Kubernetes runs containers across many machines
  • You say what you need (CPUs, memory, a GPU); it finds a machine that has it
  • NRP is one Kubernetes cluster: 536 nodes
Linux
CUDA libraries
PyTorch, NumPy
train.pyyour code

Container image

built once, from a Dockerfile

Kubernetes cluster

Node64 CPU cores
Node8 × A10 GPUs
Node4 × A100 GPUs

the scheduler picks a node with a free GPU

your container
San Diego Supercomputer Center5

Access Methods

You
Hosted LLMsbrowser chat or an API key
AI gatewaychecks your token, routes
Model serversopen-weight models on NRP GPUs
JupyterHublog in, pick an image and a GPU
Your notebook servera container started for you
A CPU or GPU nodechosen by Kubernetes
Kuberneteskubectl apply -f job.yaml
Schedulerfinds a node with what you asked for
Your podsrun, write results, exit

No 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

  • Log in with your campus account through CILogon
  • Choose an image, CPUs, memory and a GPU type
  • NRP's hubs: jupyterhub-west.nrp-nautilus.io and jupyterhub-east.nrp-nautilus.io
  • Today's demo: jh-training.nrp-nautilus.io

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

lr-0.1lr-0.001
lr-0.01
busy
busy

GPU node · 4 × RTX 3090

busy
busy
busy
busy

lr-0.001 waits in Pending until a GPU frees up; a finished job releases its GPU

San Diego Supercomputer Center6

What NRP Is For

Public or synthetic data

public datasets, simulations, benchmark and synthetic data

De-identified data

if your IRB and data use agreement allow it

Protected health information

PHI or identifiable patient data, including in LLM prompts

OK on NRP
Not on NRP

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.

San Diego Supercomputer Center7

Getting Access

San Diego Supercomputer Center8

Getting Access

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.

San Diego Supercomputer Center9

What is a Namespace?

  • Your group's workspace on the cluster
  • One per lab, project or course; the PI or instructor is its admin and adds members
  • Needed for GPU jobs, storage, your own JupyterHub, and API access to the hosted LLMs
  • Not needed to chat with the LLMs in the browser
  • What's inside is visible only to its members

Nautilus cluster

lab-smith
Dr. Smith (admin) and 3 studentsGPU jobs · a data volume · LLM tokens
bio-course
the instructor (admin) and 40 studentsa course JupyterHub · shared datasets
another-lab
their members onlyyou can't see their jobs or data
San Diego Supercomputer Center10

Talking to the Cluster

Your laptopkubectl + ~/.kube/config
CILogonyour UCLA login, once
Nautilus APIchecks who you are
Your namespacejobs, pods, data

1.  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
San Diego Supercomputer Center11

GPUs

San Diego Supercomputer Center12

GPUs on NRP

  • 1,411 GPUs in 33 models, contributed by campuses
  • Most common: A10 and RTX 3090, 24 GB each
  • About 140 A100s with 80 GB, plus H100s and H200s
  • Ask for the GPU memory your job needs, not a brand name
  • What's free right now: nrp.ai/viz/resources

1,411 GPUs across 33 models

A10279
RTX 3090207
A100 80GB SXM118
RTX 2080 Ti106
A100 slices (10 GB)105
L496
GTX 1080 Ti80
V100 32GB68
L4068
RTX A600043
V100 16GB32
RTX A400032
H10024
A100 80GB PCIe24
19 other models129
Up to 16 GB20–24 GB32–48 GB80 GB and up
San Diego Supercomputer Center13

Choosing a GPU

GPU memoryExamplesGood forHow to ask
Up to 16 GBRTX 2080 Ti, GTX 1080 Ti, A4000, A100 slicesTeaching, debugging, classic ML, small CNNsnvidia.com/gpu: 1
20–24 GBA10, RTX 3090, L4, RTX 4090Most deep learning; fine-tuning and serving models up to ~8B parametersnvidia.com/gpu: 1 + memory or model
32–48 GBL40, V100 32 GB, RTX A6000, A40Bigger models and batches; serving models up to ~30Bnvidia.com/gpu, or rtxa6000 / a40
80 GB and upA100 80 GB, H100, H200Large training runs and large modelsA100: access request; H100/H200 reserved

Current PyTorch builds need Turing or newer: on a GTX 1080 Ti or V100, use an older image.

San Diego Supercomputer Center14

Ways to Run Work

Interactive: JupyterHub

  • Pick a GPU from the start menu; explore, debug, teach
  • Idle servers stop: 1 hour after you close the browser on NRP's hub, 6 hours at most on any hub

Interactive: a pod

  • Start a container with kubectl, then open a shell in it
  • Deleted after 6 hours; at most 2 GPUs

Long-running: a Deployment

  • Keeps a service up (a web app, a database) and restarts it if it crashes
  • Removed after 2 weeks unless admins grant an exception; no GPU if it sits mostly idle

Batch: a Job

  • Runs your script to the end, then gives the GPU back
  • Submit many at once; the rest wait in Pending for a free GPU
$ kubectl apply -f sweep/        # six training jobs
Pendinglr-0.1lr-0.03lr-0.01lr-0.003lr-0.001lr-0.0003GPU 1GPU 2GPU 3GPU 4lr-0.1lr-0.03lr-0.01lr-0.003lr-0.001lr-0.0003time

Six 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

GPUyou work in notebooksidleyou close the browser1 h later: server stops, GPU back to the pool
$ 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
GPUdev-pod: a shell, tests, debugging6 h: the pod is deleted

Deployment web-app · 2 replicas

web-app-5d59d-x2kqpRunning
web-app-5d59d-m4q9dRunningweb-app-5d59d-m4q9dcrashedweb-app-5d59d-c8w3nRunning

Kubernetes keeps two copies running; when one crashes, it starts a replacement

Nodeweb-appweb-app (replacement)crash: restarted for you2 weeks: removed, unless admins grant an exception
San Diego Supercomputer Center15

A GPU Job

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

San Diego Supercomputer Center16

Running the Job

# 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.

Output, 9 Nov 2026
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.
San Diego Supercomputer Center17

Using GPUs Fairly

Do

  • Run batch work as a Job that exits
  • Request what you'll use; keep limits within 20% of requests
  • Keep data on a persistent volume or in S3
  • Run a sweep as many one-GPU jobs
  • Borrow idle A100/H100s with priorityClassName: opportunistic, and checkpoint

Don't

  • Leave a notebook holding a GPU overnight
  • Put sleep in a Job to keep a GPU (bannable)
  • Ask for 4 GPUs "just in case": use must stay above 40%
  • Keep results on the pod's own disk; it vanishes with the pod
San Diego Supercomputer Center18

AI Services

San Diego Supercomputer Center19

Hosted LLMs

  • Open-weight models on NRP GPUs, behind one OpenAI-compatible endpoint:
  • ellm.nrp-nautilus.io/v1
  • Free for non-commercial research and education
  • Prompts are processed on NRP hardware, not sent to a commercial provider
  • Still not for PHI
  • About 7.1 billion tokens a day (September 2026)
ModelGood for
qwen3, qwen3-smallHard reasoning, long documents, images
gpt-ossGeneral chat, reproducible research
glm-5, kimi, minimaxAgentic coding
deepseek-v4-flashWhole codebases, very long documents
gemma, gemma-smallImages, video, audio transcription
qwen3-embeddingSearch and RAG (embeddings)

Uses from the models page, 26 Oct 2026. The catalog rotates.

San Diego Supercomputer Center20

Using the LLMs

  • In the browser: Open WebUI
  • nrp-openwebui.nrp-nautilus.io
  • From code: the standard OpenAI library; token from nrp.ai/llmtoken
  • In JupyterHub: Jupyter AI (in the demo)
  • Coding agents: Claude Code, opencode, VS Code and others
  • tested configurations in the NRP docs

Claude Code on NRP's gpt-oss, asked about the demo's GPU job

opencode on NRP's qwen3, same question

San Diego Supercomputer Center21

Jupyter AI

  • Already pointed at NRP's models on the training hub, and on any course hub you run
  • Chat panel: ask about code, an error or a concept
  • /fix: select a cell that crashed; it explains and proposes a fix
  • %%ai magics: {variables} in a prompt become their live values, so the model sees your data
%%ai openai-chat:gpt-ossHere is a summary of my dataset: {summary}Which columns would you check first, and why?
San Diego Supercomputer Center22

Running Your Own Models

  • Serve your own model: vLLM or SGLang on a GPU in your namespace, your weights or your fine-tune behind the same OpenAI API; ask the admins before running one as a long-lived service
  • Train and fine-tune: PyTorch and Hugging Face in GPU jobs, from one GPU to eight on a node
  • Search your documents (RAG): qwen3-embedding and NRP's managed Milvus vector database
  • Inference accelerators: Qualcomm Cloud AI 100 cards, requested in a job like a GPU

Worked examples: the PEARC26 tutorial (serving, RAG), and a physics neural network trained in GPU jobs (CMS HATS)

San Diego Supercomputer Center23

Labs and Classes

San Diego Supercomputer Center24

JupyterHub for Classes

Your class needsA hub on NRP gives it
The same environment for every studentA container image you choose
No laptop setup on day oneJupyterLab in the browser, with campus login
GPUs for a neural-network unitGPU options on the start menu, with limits
An AI assistant, without per-seat feesJupyter AI and the hosted LLMs, preconfigured
Shared datasets and notebooksOne shared volume in every server
  • Instructors: contact us; we'll help you set up a hub for your lab or course
  • It's one configuration file in a namespace you own
  • Students: if your course needs GPUs, ask your professor to get in touch
San Diego Supercomputer Center25

Getting Started

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

  • Documentation: nrp.ai/documentation
  • Support chat and email: nrp.ai/contact
  • Labs, courses or a UCLA campus group: d4diaz@ucsd.edu
San Diego Supercomputer Center26

Live Demo

San Diego Supercomputer Center27

Acknowledgments

  • NRP is supported by NSF awards OAC-1541349, OAC-1826967, OAC-2030508, OAC-1841530, OAC-2005369, OAC-2112167, CISE-1713149, CISE-2100237 and CISE-2120019
  • Networks: CENIC, Pacific Wave, Internet2, MREN, GPN, NYSERNet, FLR, NEREN, Sun Corridor, OARnet, SCLR and the Albuquerque GigaPoP
  • The NRP operations teams at SDSC, the University of Nebraska–Lincoln and MGHPCC, and the campuses that host and share their hardware, UCLA among them
  • Clifford and UCLA Health IT's Research Tech Talks, for hosting
San Diego Supercomputer Center28

Questions?

Daniel Diaz · d4diaz@ucsd.edu

→ next · ← back · F full screen