Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
d945e75
Create modelrepotest.mdx
lavanya-gunreddi Jul 7, 2026
f0f0a00
Update docs.json
lavanya-gunreddi Jul 7, 2026
a3d9215
Add Install Go as step one in Model Repo testing guide
promptless[bot] Jul 8, 2026
6ff93f5
Update modelrepotest.mdx
lavanya-gunreddi Jul 13, 2026
c4019e6
Merge branch 'main' into lg-modelrepotest
lavanya-gunreddi Jul 14, 2026
db399f3
Address review comments on modelrepotest.mdx
promptless[bot] Jul 14, 2026
b25c3c9
Create overview.mdx
lavanya-gunreddi Jul 20, 2026
54a576e
Create security
lavanya-gunreddi Jul 20, 2026
47c84f7
Create testing.mdx
lavanya-gunreddi Jul 20, 2026
b2e0472
Update docs.json
lavanya-gunreddi Jul 20, 2026
2757798
Update docs.json
lavanya-gunreddi Jul 21, 2026
f3e686b
Rename security to security.mdx
lavanya-gunreddi Jul 21, 2026
029322f
Update docs.json
lavanya-gunreddi Jul 21, 2026
5d17d4e
Update overview.mdx
lavanya-gunreddi Jul 21, 2026
60a453f
Update security.mdx
lavanya-gunreddi Jul 21, 2026
3b180d7
Update docs.json
lavanya-gunreddi Jul 21, 2026
ab7a48f
Update overview.mdx
lavanya-gunreddi Jul 21, 2026
77f1859
Update security.mdx
lavanya-gunreddi Jul 21, 2026
91c9f6d
Update overview.mdx
lavanya-gunreddi Jul 21, 2026
83af1e8
Update overview.mdx
lavanya-gunreddi Jul 21, 2026
397da03
Update security.mdx
lavanya-gunreddi Jul 21, 2026
6a8d6bd
Merge branch 'main' into lg-modelrepotest
lavanya-gunreddi Jul 23, 2026
e72b838
Apply review feedback to Model Repo overview
promptless[bot] Jul 23, 2026
125d789
Merge branch 'main' into lg-modelrepotest
lavanya-gunreddi Jul 27, 2026
134a8b5
Apply PR #696 review feedback to Model Repo testing
promptless[bot] Jul 27, 2026
e0e8d4e
Apply PR #696 review feedback on Model Repo overview
promptless[bot] Jul 27, 2026
7854560
Update overview.mdxdocs: revise overview.mdx — add diagram, slim comp…
lavanya-gunreddi Jul 27, 2026
ba6f908
docs: revise testing.mdx — fix MODEL_NAME, reword warning, remove scr…
lavanya-gunreddi Jul 27, 2026
684a3b6
docs: remove em dashes from Model Repo prose per PR #696 review
promptless[bot] Jul 27, 2026
93a00ee
docs: add key benefits section to overview.mdx
lavanya-gunreddi Jul 27, 2026
d5e43c0
Apply DOCS-474 remaining changes: runpodctl update note, multi-GPU ex…
lavanya-gunreddi Jul 30, 2026
8fecdd2
Delete serverless/modelrepotest.mdx
lavanya-gunreddi Aug 3, 2026
bbc4b92
Merge branch 'main' into lg-modelrepotest
lavanya-gunreddi Aug 3, 2026
3b490e5
Update docs.json
lavanya-gunreddi Aug 3, 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
8 changes: 8 additions & 0 deletions docs.json
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,14 @@
"serverless/development/dual-mode-worker"
]
},
{
"group": "Storage",
"pages": [
"serverless/storage/modelrepo/overview",
"serverless/storage/modelrepo/security",
"serverless/storage/modelrepo/testing"
]
},
{
"group": "Manage endpoints",
"pages": [
Expand Down
64 changes: 64 additions & 0 deletions serverless/storage/modelrepo/overview.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
---
title: "Overview"

@ashleyfrith-alt ashleyfrith-alt Jul 21, 2026

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not a comment on content but placement of the doc -- right now it's labeled as "storage" within serverless. I would argue since this is essentially a new primitive it deserves its own section similar to Pods / Serverless (with a callout that it only works for Serverless right now and pod support is coming soon). Needs team input though

I would expect the name of the section to also match the feature name "Model Repository" (or whatever it is we land on -- but for now would suggest going with this especially knowing they are confusing Model repo with network volume storage.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@ashleyfrith-alt @brosenpod @k-nox Good point — this needs a team decision before we can act on it. Two questions to align on:

Should Model Repo be a top-level section alongside Pods and Serverless, or stay nested under Serverless > Storage?
Did we agree on a name for model repo?

Once there's alignment we can update the sidebar config and rename accordingly.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ashley's 7/21 question here (own top-level nav section vs. nested under Serverless > Storage, plus whether "Model Repository" is the final name) was escalated on 7/27 but I don't see a resolution yet. Can we get an explicit decision this week so this doesn't ship under a placement/name we're about to change again?

sidebarTitle: "Overview"
description: "Store, version, and pre-cache your model files on Runpod infrastructure."
---

<Note>
Model Repo is currently in beta and is available on Mac and Linux only. Windows support is coming soon.
</Note>

Model Repo is a private model storage service built into Runpod. Upload your model files once, and Runpod caches them directly on your Serverless worker hosts so they are ready before the worker starts. No external download is required at cold start time.

## Key benefits

- **Faster cold starts**: Models are pre-cached on worker hosts when available, so workers start faster without waiting for an external download.
- **No HuggingFace dependency**: Your models are stored in Runpod's infrastructure, so endpoints don't require an outbound download on every cold start.
- **Private storage**: Models are stored in your account and are not accessible to other users.
- **Version control**: Each upload is content-addressed, so you can pin an endpoint to an exact model version and roll back at any time.

## How it works

```mermaid
flowchart LR
A["Upload model\nrunpodctl model add"] --> B["Runpod hashes\n& stores files"]
B --> C["Configure endpoint\n--model-reference URL"]
C --> D["Worker host\npre-caches files"]
D --> E["Worker starts\nfiles ready on disk"]
```

1. Upload your model files using `runpodctl model add`.
2. Runpod computes a content hash and stores the files in private, secure storage.
3. Reference the model using the URL `https://local/{user-id}/{model-name}:{hash}` when configuring your endpoint.
4. When a worker starts, Runpod pre-caches the model files on the host before the container boots.
5. Your handler reads the model from a local path inside the container.

## What you can upload

Model Repo accepts any file format — PyTorch checkpoints, GGUF, safetensors, ONNX, or any format your worker needs. There is no type checking.

- **Max file size:** 5TB per file
- **Retention:** Files are retained indefinitely
- **Total storage limit:** Still being finalized

## Model Repo vs network volumes

**Use Model Repo when:**
- You have fixed, versioned model weights and want faster cold starts without external downloads
- You need version control over exactly which checkpoint is deployed
- Your endpoint spans multiple datacenters — Model Repo works across all DCs, while a network volume is tied to one

**Use a network volume when:**
- Workers need shared read/write access during a run (e.g., checkpoints, fine-tuning outputs)
- Your files change frequently and all workers need to see updates immediately
- You need many concurrent workers accessing the same files simultaneously

## Your data

Your models are stored in private, secure storage and are isolated to your Runpod account — no other users can access or list your models. Runpod does not access, analyze, or use your model files for any purpose.

For encryption details, certifications, and compliance information, see [Security](/serverless/storage/modelrepo/security).

## Getting started

See [Model Repo testing](/serverless/storage/modelrepo/testing) for a step-by-step guide to uploading a model and deploying it to a Serverless endpoint.
40 changes: 40 additions & 0 deletions serverless/storage/modelrepo/security.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
---
title: "Security"
sidebarTitle: "Security"
description: "How Model Repo stores and protects your model data."
---

## Storage

Model Repo stores your model files in Runpod's infrastructure, backed by [Cloudflare R2](https://developers.cloudflare.com/r2/). Your data is isolated to your Runpod account and is not accessible to other users.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As above, I am not sure if we want to specifically call out R2. But that is probably a Product decision.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@brosenpod To whom should we direct this question for an answer.


## Encryption

All model data is encrypted at every stage:

- **At rest**: AES-256-GCM encryption, applied by default to all objects stored in Cloudflare R2.
- **In transit**: TLS encryption for all transfers, both between your machine and Runpod when uploading and between Runpod's systems when caching models on worker hosts.

## Your data is yours

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

feels like this belongs in overview -- I'm envisioning overview through more of a storytelling approach; quick diagram how it works, your data is yours, here's link to compliance docs if you want them (don't need a separate section called compliance imo -- just link it under the your data yours section


Runpod does not access, analyze, or use your model files for any purpose. Models stored in Model Repo are not used for training, evaluation, or any other internal purpose. Only you can access your models through your account credentials.

## Compliance

/* [ENGINEERING: Ben Rosenberg mentioned linking to SOC1/SOC2 certs. What certifications does Runpod currently hold, and where are they published? Confirm the correct link for Runpod's security/compliance page.] -->

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should also double check that R2 also holds those certs and that the way we use it is also in line with those certs.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@brosenpod To whom should we direct this question for an answer.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This placeholder (and the related open threads at line 9 and elsewhere on this file) asks whether R2 actually holds the SOC1/SOC2 certs being claimed here and whether Runpod's usage of it is compliant — still unanswered as of 7/27 ("To whom should we direct this question for an answer?"). This reads as an unverified compliance claim if it ships as-is. Given Ben's limited remaining time, can we get this explicitly reassigned to whoever owns Security/Compliance now, rather than leaving it on his plate?


Runpod maintains industry-standard security certifications. For a full overview of Runpod's security posture, certifications, and policies, see [runpod.io/security](https://runpod.io/security).

## Frequently asked questions

**Does Runpod use my models to train other models?**

No. Your model files are stored privately and are never used by Runpod for any purpose.

**Can other Runpod users access my models?**

No. Models are scoped to your Runpod account. Other users cannot access or list your models.

**Who manages the storage infrastructure?**

Cloudflare R2 is the underlying object storage backend. Cloudflare applies encryption-at-rest using AES-256-GCM by default. Runpod manages the access layer and authentication. Only your Runpod API key can retrieve your models.
175 changes: 175 additions & 0 deletions serverless/storage/modelrepo/testing.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,175 @@
---
title: "Model Repo testing"
description: "Upload a model to Model Repo and deploy it to a Serverless endpoint."
---

<Note>
Model Repo is currently in beta and is available on Mac and Linux only. Windows support is coming soon.
</Note>

## Why use Model Repo

Model Repo lets you upload your own models to private storage on Runpod and attach them directly to Serverless endpoints. Key benefits:

- **Faster cold starts**: Models are pre-cached on worker hosts when available, so cold starts are typically faster. In some cases a model may still need to be fetched from storage.
- **No HuggingFace dependency**: Your models are stored in Runpod's infrastructure, so endpoints don't require an outbound download on every cold start.
- **Private storage**: Models are stored in your account and are not accessible to other users.

---

## Prerequisites

- Your email is feature-flagged for Model Repo access.
- `jq` is installed for parsing JSON output.

---

## Step 1: Set environment variables

Export the following before running any commands. **Make sure to set your actual API key — missing this is the most common source of auth errors later.**

```bash
export RUNPOD_API_URL="https://rest.runpod.io/v1"
export RUNPOD_GRAPHQL_URL="https://api.runpod.io/graphql"
export RUNPOD_API_KEY="your-api-key" # replace with your actual API key

export MODEL_NAME="my-model" # name to register your model under
export MODEL_PATH="/path/to/model" # local path to the model files you want to upload
```

<Note>
Each upload under the same `MODEL_NAME` creates a new version of that model, not a new model. Use a different name if you want a separate model entry.
</Note>

---

## Step 2: Install runpodctl

Already have runpodctl installed? Update it first:

```bash
runpodctl update
```

**Option A: Install via Homebrew (recommended)**

```bash
brew install runpod/runpodctl/runpodctl
```

**Option B: Build from source**

```bash
brew install go # install Go, required to build runpodctl
git clone git@github.com:runpod/runpodctl.git
cd runpodctl
make # builds the binary to ./bin/runpodctl
```

<Note>
If you build from source, the binary is at `./bin/runpodctl`. Either run it with that path, or add `./bin` to your `PATH`. The steps below use `runpodctl` — adjust accordingly.
</Note>

---

## Step 3: Upload the model

```bash
# --name: the name to register the model under in your repo
# --model-path: local path to the model files
# --create-upload: creates the upload session and transfers files
# --wait-for-hash: waits for the background hashing process to complete
runpodctl model add \
--name "$MODEL_NAME" \
--model-path "$MODEL_PATH" \
--create-upload \
--wait-for-hash
```

This outputs a JSON string listing all uploaded files.

---

## Step 4: Get your user ID and model hash

```bash
export USER_ID="$(runpodctl user | jq -r '.id')" # your Runpod user ID
export MODEL_HASH="$(runpodctl model list --name "$MODEL_NAME" | jq -r '.[0].versions[0].hash')" # the model version hash
```

---

## Step 5: Deploy a Serverless endpoint with the model attached

```bash
# --name: name for the endpoint
# --hub-id: Hub template to deploy
# --gpu-ids: comma-separated list of GPU pools to target (up to 3)
# --workers-max: maximum number of active workers
# --workers-min: minimum number of workers kept warm
# --model-reference: attaches your model to the endpoint
# --env MODEL_NAME: sets the model path on the worker
# --min-cuda-version: works around a bug in runpodctl
runpodctl serverless create \
--name "my_worker" \
--hub-id "cm8h09d9n000008jvh2rqdsmb" \
--gpu-ids "AMPERE_24,AMPERE_48,ADA_24" \
--workers-max 3 \
--workers-min 1 \
--model-reference "https://local/$USER_ID/$MODEL_NAME:$MODEL_HASH" \
--env MODEL_NAME="/runpod/model-store/modelrepo-local/models/$USER_ID/$MODEL_NAME/$MODEL_HASH" \
--min-cuda-version "13.0"
```

<Note>
`--model-reference` is only supported with `--hub-id` and GPU endpoints. It is repeatable if you need to attach multiple models to the same endpoint. The `--env MODEL_NAME` flag passes the full local path to the worker so your handler knows where to find the model files.
</Note>

<Note>
You can target up to 3 GPU pools by passing a comma-separated list to `--gpu-ids`. Runpod schedules workers on whichever pool has availability.
</Note>

<Note>
**What "pre-cached" means:** When a worker starts, Runpod copies your model files from storage onto the worker host's local disk before the container boots. This eliminates the external download on cold start. Files stay on disk for as long as the worker is running; if the worker is replaced, the next worker pre-caches the files again on startup.
</Note>

---

## Step 6: Verify the model is working

Send a test request to confirm the endpoint is live and the model is accessible. Replace `ENDPOINT_ID` with the ID returned in the previous step:

```bash
curl -s -X POST "https://api.runpod.ai/v2/${ENDPOINT_ID}/runsync" \
-H "Authorization: Bearer $RUNPOD_API_KEY" \
-H "Content-Type: application/json" \
-d '{"input": {"prompt": "hello"}}' | jq
```

A successful response confirms the endpoint is running and the model is attached. If the request fails with an auth error, verify that `RUNPOD_API_KEY` is set correctly.

You can also send requests from the web UI if you prefer a graphical interface.

---

## Step 7: Clean up

Delete the endpoint after testing to stop accruing spend. Use the web UI or:

```bash
runpodctl serverless delete <endpoint-id>
```

---

## Removing a model

To remove a model and all its versions from your repo:

```bash
runpodctl model remove --name "$MODEL_NAME"
```

<Warning>
This removes the entire model and all its versions. There is currently no way to remove a single version. Make sure no active endpoints reference this model before removing it.
</Warning>
Loading