Files
TheRock/docs/rfcs/RFC0012-Repo-Structure.md
derek.holloway 7502bf64a4
CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
Flatten subprojects into a single base monorepo
2026-09-02 16:34:47 -07:00

718 lines
36 KiB
Markdown

---
author: Saad Rahim (saadrahim)
created: 2026-04-08
modified: 2026-06-09
status: Approved
---
# ROCm software ecosystem package repository structure
## Overview
repo.amd.com's open source software release publications need standardization. In scope is the ROCm software ecosystem which spans the ROCm Core SDK, expansions like ROCm-DS, and standalone projects like RVS. Software packaging for this ecosystem needs a well defined hierarchy reflected in the package distribution folder structure. As software is published on repo.amd.com, the planned hierarchy must be extensible by other software ecosystem published by AMD. As a result, this proposal includes the ability to add the AMD GPU driver to this structure in the future.
## Definitions
- Repository Streams
- dev - per-commit / pre-nightly developer builds, promoted in from
the prior `rocm.devreleases.amd.com` host. Lowest bar; intended
for developer-facing testing and infra dry-runs, not end users.
- nightly - nightly builds from the develop branch
- weekly - weekly promotion of a nightly build, retained on a
longer horizon than `nightly` for integration testing and as a
stable target for downstream CI that does not need per-day churn.
Cadence: one promotion per ISO calendar week.
- rc - release candidate builds for the next stable release
- stable - GA releases of ROCm with a short term support lifecycle, tagged as ROCm releases.
- ltsrc - *(future)* release candidate builds for the next LTS release
- lts - *(future)* long term stability (LTS) releases
`archives` is **not** a release stream — it is a retention-only
subdomain that hosts unmaintained content migrated from other
sources. See *Stream Subdomains* and *Structure on
`archives.repo.amd.com`* below.
> **Note on stream vocabulary:** RFC0012 does not define a strict
> stream taxonomy for extras — it only states that extras may publish
> "nightly / pre-release builds … to a staging repository for early
> validation" alongside ordinary releases. The canonical streams on
> `repo.amd.com` are the ones defined in this RFC
> (`dev`/`nightly`/`weekly`/`rc`/`stable`, with `ltsrc`/`lts`
> reserved). Per-extra publishing maps into those streams as follows:
> per-commit / developer builds → `dev/`, nightly / staging builds →
> `nightly/`, weekly-promoted builds intended for downstream CI →
> `weekly/`, pre-release builds intended for QA → `rc/`, GA releases →
> `stable/`. Each extra's release notes record which stream a given
> build landed in.
- Products
- **Core SDK** — the ROCm Core SDK; published under `core/` on
every stream subdomain.
- **Expansions** — SDKs built with dependencies on the ROCm Core
SDK (e.g. Computer Vision SDK, ROCm-DS, future
cadenced SDKs). **Expansions are not a folder.** Each expansion
is published as a **top-level peer to `core/`** under each
stream subdomain's `rocm/` tree (e.g.
`computer-vision-sdk/`, `rocm-ds/`), with its own cadence and
ROCm pinning rule defined in its own RFC. There is no
`expansions/` parent folder.
- **Third-party AI forks** — `pytorch/`, `jax/`,
`onnx-runtime/`. Also top-level peers to `core/`; AMD/ROCm forks
of upstream third-party AI frameworks, published as ROCm-built
wheels (see *Third Party AI Forks*).
- **Extras** — standalone components part of ROCm, released
independently per ROCm major version; published under a **single
`extras/` folder** (no `-<ROCm-major>` suffix). For **native
packages** the ROCm major lives in the package name
(`amdrocm<major>-<project>`), not the folder path; for **Python
wheels** the major is *not* in the name — it is carried by the
`+rocm<major>` PEP 440 local-version tag and a matching
`Requires-Dist` range (see *Structure on each
`<stream>.repo.amd.com` subdomain* → *extras/*). Either way every
major coexists in one tree.
- Python wheel indices — two **central** sibling PEP 503 indices per
stream, sitting directly under each subdomain's `rocm/` tree (no
`pyindex/` wrapper), per
[ROCm/TheRock#5289](https://github.com/ROCm/TheRock/pull/5289).
See "Python Indices" section:
- `whl/` — backward-compatible / all-arch index where
`pip install rocm` pulls in every device extra automatically.
Matches the PyTorch `download.pytorch.org/whl/` shape so users
can swap index URLs without changing install habits.
- `whl-next/` — explicit-device-extras index where the user picks
the device they want (e.g. `pip install rocm[device-gfx942]`).
Smaller installs; requires the user to know their target arch.
## Stream Subdomains
Each release stream is hosted at its own subdomain of `repo.amd.com`,
using the pattern `<stream>.repo.amd.com`. The subdomain *is* the
stream selector — stream-scoped paths sit at the root of the subdomain
rather than under a `<stream>/` prefix on the parent domain.
Release streams (grouped by lifecycle):
| Stream | Subdomain | Status |
| :------ | :--------------------- | :---------------- |
| stable | `stable.repo.amd.com` | required at v1 |
| rc | `rc.repo.amd.com` | required at v1 |
| weekly | `weekly.repo.amd.com` | required at v2 |
| nightly | `nightly.repo.amd.com` | required at v2 |
| dev | `dev.repo.amd.com` | required at v2 |
| ltsrc | `ltsrc.repo.amd.com` | future (reserved) |
| lts | `lts.repo.amd.com` | future (reserved) |
Retention / archive subdomain (not a release stream):
| Subdomain | Status | Purpose |
| :---------------------- | :------------- | :------------------------------ |
| `archives.repo.amd.com` | required at v2 | unmaintained content; read-only |
The `dev` subdomain **replaces** the existing
`rocm.devreleases.amd.com` host. Once `dev.repo.amd.com` is live, the
old host is redirected to it and retired. This brings developer
pre-nightly builds under the same domain, certificate, and stream
contract as every other stream.
Two folders are **singletons** on the bare `repo.amd.com` domain and
do **not** follow the stream subdomain pattern:
- `amdrepos/` — the repo-packages folder (see Repository Package
section). Hosted at `https://repo.amd.com/amdrepos/`. Serves all
streams; stream selection happens inside the installed tier
package (`amdrocm-repo-stable`, `amdrocm-repo-stablerc`,
`amdrocm-repo-nightly`, or `amdrocm-repo-dev`) via the active
stream variable. Each tier package only exposes the streams it
owns — see *Repository Package* for the tier table.
- `rocm/` — the existing non-production `rocm/` folder. Hosted at
`https://repo.amd.com/rocm/`. Retained as-is for backward
compatibility and scheduled to move to `archives.repo.amd.com` in
6 months.
Rules:
- Each stream subdomain serves **only** the artifacts for its own
stream. There is no cross-stream pathing on a single subdomain.
- The folder hierarchy under each stream subdomain matches the
per-stream structure defined in the next section (e.g. `core/`,
per-expansion folders such as `computer-vision-sdk/` /
`rocm-ds/`, `extras/`, `whl/`, `whl-next/`,
`pytorch/`, etc. — every expansion is a top-level peer; there is
no `expansions/` grouping folder).
- The bare `repo.amd.com` domain serves as a **navigation landing
page** plus the two singleton folders (`amdrepos/` and `rocm/`). It
must list and link to every stream subdomain so a user starting at
`https://repo.amd.com/` can click through to any active stream.
Beyond the landing page and the two singleton folders, it is **not**
required to serve any artifact content directly —
`repo.amd.com/<stream>/...` paths are not part of the contract, and
canonical artifact URLs live exclusively on the stream subdomains.
- The tier repo packages (`amdrocm-repo-stable`,
`amdrocm-repo-stablerc`, `amdrocm-repo-nightly`, `amdrocm-repo-dev`;
see *Repository Package* section) each install `baseurl` / APT
sources pointing at the subset of stream subdomains they cover,
selected by the user's active stream variable (e.g.
`https://${amdrocm_release_stream}.repo.amd.com/...`). The repo
packages themselves are downloaded from
`https://repo.amd.com/amdrepos/`.
- TLS certificates must cover every stream subdomain plus the bare
`repo.amd.com` (wildcard `*.repo.amd.com` plus the apex is
acceptable).
- Reserved future subdomains (`ltsrc`, `lts`) must resolve before
content is published, even if they initially serve an empty index,
so that repo-package definitions referencing them do not break.
## Repository Structure
Hosting splits into three layers, each with its own structure:
1. The **bare `repo.amd.com`** domain (landing page + singletons).
1. The **stream subdomains** `<stream>.repo.amd.com` for `<stream>` in
`{dev, nightly, weekly, rc, stable, ltsrc, lts}` — all share an
identical folder tree.
1. The **`archives.repo.amd.com`** subdomain (retention only).
### Structure on `repo.amd.com` (bare domain)
The bare domain hosts only the navigation landing page and the two
singleton folders. No per-stream artifact content lives here.
- **(landing page)** — `https://repo.amd.com/` — links to every
active stream subdomain and the archives subdomain.
- **amdrepos/** *(singleton — `https://repo.amd.com/amdrepos/`)*
- **per-distro subdirectories** — one folder per supported distro
(e.g. `ubuntu2404/`, `ubuntu2204/`, `rhel9/`, `rhel10/`,
`sles16/`, `azurelinux3/`). Each distro ships its own copy of
every tier package (`amdrocm-repo-stable`, `amdrocm-repo-stablerc`,
`amdrocm-repo-nightly`, `amdrocm-repo-dev`) because repo file
install paths and URL suffixes are distro-family specific
(rpm-family → `/etc/yum.repos.d/`, deb-family →
`/etc/apt/sources.list.d/`).
- **gpg/** — public signing keys served alongside the repo
packages. Each tier package references the key by URL so
`dnf` / `apt-key` can fetch and pin it on install. Keys are
rotated through repo-package upgrades; the previous key is kept
for one release cycle to allow non-broken upgrades.
- See Repository Package section for contents and the per-tier
install commands.
- **rocm/** *(singleton — `https://repo.amd.com/rocm/`)* — current
legacy `rocm/` folder with non-production releases. Retained for
backward compatibility; to be moved to `archives.repo.amd.com` in
6 months. While retained, the bare-domain `rocm/` also serves as a
**navigation index** to the per-stream `rocm/` trees on the stream
subdomains — each entry below is a folder-style link off
`https://repo.amd.com/rocm/` that redirects to (or browses through
to) the matching stream subdomain's `rocm/` root:
- `dev/` → `https://dev.repo.amd.com/rocm/`
- `nightly/` → `https://nightly.repo.amd.com/rocm/`
- `weekly/` → `https://weekly.repo.amd.com/rocm/`
- `rc/` → `https://rc.repo.amd.com/rocm/`
- `stable/` → `https://stable.repo.amd.com/rocm/`
- `ltsrc/` *(future)* → `https://ltsrc.repo.amd.com/rocm/`
- `lts/` *(future)* → `https://lts.repo.amd.com/rocm/`
These links are **navigation only** — canonical artifact URLs live
on the stream subdomains, and package-manager `baseurl`s point
directly at `<stream>.repo.amd.com`, never at
`repo.amd.com/rocm/<stream>/`. The legacy non-production content
underneath `https://repo.amd.com/rocm/` remains in place at its
existing paths (untouched by these new per-stream link entries)
until the 6-month archive migration.
> **Name reuse note:** the singleton `rocm/` on the bare domain and
> the `rocm/` folder under each stream subdomain (see next section)
> share the same name but live on different hosts
> (`repo.amd.com/rocm/` vs `<stream>.repo.amd.com/rocm/`). The
> bare-domain `rocm/` is the legacy folder slated for archive **plus**
> a navigation index linking out to each `<stream>.repo.amd.com/rocm/`
> tree; the per-subdomain `rocm/` is the new ROCm platform tree where
> all production artifacts actually live. The per-stream links under
> the bare-domain `rocm/` are not artifact paths — they only point a
> browsing user at the right subdomain.
### Structure on each `<stream>.repo.amd.com` subdomain
The folder tree below is **identical across every stream subdomain**
(`dev`, `nightly`, `weekly`, `rc`, `stable`, `ltsrc`, `lts`).
Stream-specific specializations (per-stream content variants,
retention) are captured in *Per-stream specializations* further down.
- **amdgpu/** *(reserved for future use; same tree, future GPU driver
artifacts)*
- **rocm/**
- **whl/** — **central** PEP 503 simple index for the entire
stream — **backward-compatible / all-arch** variant. A single
`whl/` serves wheels from every wheel-producing area in the
stream (`core/`, every top-level expansion, wheel-producing extras,
`pytorch/`, `jax/`, `onnx-runtime/`). `pip install rocm` (or `pip install torch`) against this index pulls in
**all** device extras automatically. Matches the PyTorch
`download.pytorch.org/whl/` shape.
- **whl-next/** — **central** PEP 503 simple index for the entire
stream — **explicit-device-extras** variant. The user picks the
device they want (e.g. `pip install rocm[device-gfx942]`).
Smaller installs; requires the user to know their target arch.
Serves the same set of wheel-producing areas as `whl/`.
See Python Indices section. There is no per-package central
index; the per-component `whl/` and `whl-next/` folders listed
below are storage buckets that the central indices reference.
- **core/**
- tarball — Linux archive format, **primarily `.tar.gz`**.
- zip — **Windows only**; the `.zip` archive is the Windows
equivalent of the Linux tarball and is not produced for Linux
distros. A single Windows OS variant agnostic `.zip` is published in
`zip/` as one build covers all supported Windows
versions.
- windows-installers — Windows installer artifacts (`.exe`,
`.msi`) for setups that don't unpack the `zip` archive.
Organized into **one subfolder per supported Windows OS
version**, using the commonly used short names. Supported
versions:
- `win11/` — Windows 11 (client)
- `server2022/` — Windows Server 2022
- `server2025/` — Windows Server 2025
Windows 10 is **not** supported and has no folder. Additional
OS versions follow the same flat short-name convention
(`winNN/` for client, `serverYYYY/` for server) and are added
as they become supported. Each OS folder contains the
`.exe` / `.msi` artifacts for that OS; per-OS variants (debug,
etc.) follow the same `<os>-<variant>/` sibling-folder rule
used for Linux distros (e.g. `win11-debug/`) if and when they
ship.
- linux-installers — Linux installer artifacts, including the
runfile installer (`.run` self-extracting installer for
environments without a package manager).
- **whl/** — backward-compatible / all-arch wheels (referenced
by the central `whl/` index above).
- **whl-next/** — explicit-device-extras wheels (referenced by
the central `whl-next/` index above). Internal folder layout,
filenames, and sub-paths are implementation details left to
the publish tooling — not consumed by humans.
- packages
- **Layout under `packages/` is intentionally left to the
publishing implementation.** This RFC does **not** fix whether
packages are exposed as per-distro folders (`<distro>-*`) or
grouped by package family (`deb/`, `rpm/`), nor whether the
OS/distro profile is encoded in the directory tree at all or
surfaced only through the aggregated package index. Any of
these realizations is acceptable as long as the normative
requirements below hold; the goal is to keep the on-disk scheme
flexible so it can evolve with the packaging tooling.
The only **normative** requirements are:
- **Standard is the default.** A user who adds the standard
repo gets release builds by default; no extra opt-in is
needed for the ordinary install path.
- **Variant separation.** Non-standard build variants — `asan`
today, and reserved future `rpath` / `debug` variants — must
be separable so that a package manager pointed only at the
standard repo never accidentally resolves an ASAN or debug
build (e.g. `dnf install rocm` must not pull an ASAN build).
*How* that separation is realized — sibling folders, a
distinct index, or a disabled-by-default repo stanza such as
the `amdrocm-stable-rpath` stanza inside `amdrocm-repo-stable`
— is left to the implementation.
- **Defined variant and distro sets.** Build variants follow
the RFC0009 Repository Layout rule
(`Package-type = standard, asan, future variant`), and the
supported distro identifiers (`debian12`, `ubuntu2204`,
`ubuntu2404`, `rhel8`, `rhel9`, `rhel10`, `sles15`, `azl3`)
are defined by RFC0009.
*Illustrative only* — one valid per-distro realization for
RHEL 10:
```
packages/
rhel10/ # standard release packages
rhel10-asan/ # ASAN-instrumented packages
```
A `deb/` + `rpm/` grouping that carries the per-OS profiles in
the aggregated index is an equally acceptable realization. The
example is not prescriptive.
- *(no separate top-level `windows/` folder — Windows artifacts
live alongside their Linux siblings inside each component, e.g.
`core/zip`, `core/windows-installers`.)*
- **pytorch/** — `whl/` + `whl-next/` (same rule as `core/`).
- **jax/** *(follows the same artifact rules as **pytorch**)*
- **onnx-runtime/** *(follows the same artifact rules as **pytorch**)*
- **[expansion-name]/** *(top-level peer to `core/`,
`pytorch/`, `jax/`, `onnx-runtime/`)* — each expansion (e.g.
`rocm-ds/`, future SDKs built on the ROCm Core SDK) is published
as its **own top-level folder** under each stream subdomain's
`rocm/` tree, **not** grouped under an `expansions/` parent. This
matches the placement rule already used by the
third-party AI forks: every component with an independent
release cadence gets a top-level peer so its cadence is visible
in the URL and there is no intermediate namespace to navigate.
- **No `expansions/` parent folder.** A grouping folder was
considered and rejected because (a) it adds a path segment
that carries no information, (b) it hides each expansion's
cadence behind a shared name, and (c) it forces a directory
rename if a component is later reclassified between
"expansion" and something else.
- **Folder contents per expansion:** the same artifact set as
`core/` — `tarball`, `zip` (with per-OS subfolders mirroring
`core/zip/` when needed), `windows-installers/` (with per-OS
subfolders `win11/`, `server2022/`, `server2025/`, same rule
as `core/windows-installers/`),
`linux-installers`, `whl/` + `whl-next/` (per the central
indices; internal layout implementation-defined), and
`packages/` (same implementation-defined layout as
`core/packages/` — see the `packages/` rules above).
- **Cadence and pinning:** each expansion picks its own cadence
and ROCm Core SDK pinning rule; that rule belongs in the
per-expansion RFC, not here. The forthcoming Computer Vision SDK
([PR #5631](https://github.com/ROCm/TheRock/pull/5631)) is an
example of an expansion that already owns its own RFC.
- **Naming and alphabetization:** expansion folder names use the
project's canonical short name (`rocm-ds/`,
`computer-vision-sdk/`, …). Browsing the per-stream `rocm/`
tree, expansions and forks sort alphabetically alongside
`core/`; there is no enforced grouping by category.
- **extras/** — projects released independently per ROCm major
version. **Single folder, no `-<ROCm-major>` suffix** — the ROCm
major lives in the *package name* (`amdrocm<major>-<project>`),
not the folder path, so every major's packages coexist in one
`extras/` tree with a single origin per package.
- **rvs/** — tarball, packages
- **rocoptiq/** — tarball, whl, whl-next, packages
- **omnistat/** — whl, whl-next
*Rationale (revised per PR #4414 review):*
- **Decision (revised per
[PR #4414 review](https://github.com/ROCm/TheRock/pull/4414#discussion_r3348478551)):**
the earlier `extras-<ROCm-major>/` layout is dropped. Splitting
by major would have forced the same logical project (e.g.
`rvs`) to appear under multiple origins (`extras-7/rvs/`,
`extras-8/rvs/`), which **breaks the aggregated index** — each
package in that index may come from only one origin, and
multi-origin support adds churn and filename-conflict risk.
Because each major's artifacts are already distinguishable
without the folder — native package names embed the major
(`amdrocm7-rvs` vs `amdrocm8-rvs`), and Python wheels carry it
in the `+rocm<major>` local-version tag on a single-named wheel
(`rocm-rvs-…+rocm7` vs `rocm-rvs-…+rocm8`) — a single `extras/`
folder holds every major's packages without collision, each
with a single origin.
- **Per-project subfolders retained.** Inside `extras/`, each
project keeps its own folder (`extras/rvs/`,
`extras/rocoptiq/`) so S3 bucket permissions can still be
granted per project/group — that motivation is unchanged. Both
majors' packages for a project live in that one project folder
(e.g. `stable.repo.amd.com/rocm/extras/rvs/` holds
`amdrocm7-rvs` and `amdrocm10-rvs`).
- **Aggregated index — every major is included.** All extras in
`extras/` feed the central `whl/` / `whl-next/` indices,
regardless of ROCm major. Two options were weighed in review:
(a) a single `extras/` folder with every major in the index, or
(b) only the latest major in the index, older majors excluded.
**Option (a) was chosen:** every major's packages are distinct
index entries with no conflict, so **every major keeps the
one-line install** resolving its full dependency chain from a
single `--index-url`. The major is distinguished differently per
format, but both coexist in the one index:
- *Native:* the package name embeds the major
(`dnf install amdrocm7-rvs`, `dnf install amdrocm10-rvs`),
so each major is a distinct package.
- *Python wheels:* the package name **drops** the major
(`rocm-rvs`); every major is the *same* PEP 503 project page
with version entries distinguished by the `+rocm<major>`
local-version tag (`rocm-rvs-1.2.0+rocm7`,
`rocm-rvs-1.5.0+rocm10`). `pip install rocm-rvs` resolves to
the build whose `Requires-Dist: rocm[core]` range matches the
installed ROCm Core; an explicit major is pinned with
`pip install "rocm-rvs==1.2.0+rocm7"` or a constraints file.
The exclusion fallback in option (b) is unnecessary.
#### Per-stream specializations
The tree above is the same on every stream subdomain. The
stream-specific differences are:
- **`dev.repo.amd.com`** — Retention: 30 days. Per-commit /
pre-nightly developer builds, replacing the legacy
`rocm.devreleases.amd.com` host. Lowest bar of all streams; no QA
gate. Layout is a **flat package repository** under
`dev.repo.amd.com/rocm/core/packages/<distro>/` (same shape as
`stable`/`rc`). Retention is enforced by pruning old package
versions from the flat tree, not by deleting date-stamped
subfolders. Intended for developer-facing testing and infra
dry-runs; **not** for end users. No `rc`-style exclusivity applies.
- **`nightly.repo.amd.com`** — Retention: 120 nightly. Promoted
builds from the develop branch (`dev` builds that passed the
promotion gate).
- **Repo layout:** `nightly.repo.amd.com/rocm/core/packages/<distro>/`
is a **flat package repository**, identical in structure to
`stable` and `rc`. All retained nightly versions are co-resident in
that single flat tree (multiple `amdrocm-core-<NNNN>` package
versions side-by-side), so the `amdrocm-repo-nightly` package
works without a date-stamped subpath. Retention is enforced by
pruning *old package versions out of the flat tree*, not by
deleting date-stamped subfolders.
- **Relationship to `dev`:** the `30 dev / 120 nightly` retention
in earlier drafts is now split across the two streams — `dev`
keeps 30 days of per-commit builds; `nightly` keeps 120 days of
promoted builds. Both are tagged in package metadata so users can
filter via `dnf --showduplicates` and install a specific version.
- **`weekly.repo.amd.com`** — Retention: 52 weeks (one calendar year of
weekly promotions). Promotion source: the latest `nightly` build at
the cut time. Cadence: **one promotion per ISO calendar week**, cut
Monday 00:00 UTC.
- **Repo layout:** `weekly.repo.amd.com/rocm/core/packages/<distro>/`
is a **flat package repository**, identical in structure to
`nightly`, `stable`, and `rc`. All retained weekly versions are
co-resident in the flat tree. Retention is enforced by pruning
old package versions out of the flat tree.
- **Relationship to `nightly`:** every `weekly` artifact is a
direct promotion of a specific `nightly`; the `nightly` source
version is recorded in package metadata. No additional QA gate
beyond the nightly promotion gate — `weekly` exists to give
downstream CI a stable, longer-retention target with predictable
cadence, not to add a quality bar.
- **Intended consumers:** downstream CI pipelines, framework
integrators, and partners who want one bump per week instead of
one per night. Not a substitute for `rc`/`stable` for end users.
- **`rc.repo.amd.com`** — Retention: 2 years. Release-candidate builds
for the next stable release; tested by QA. Must match `stable`
layout.
- **`stable.repo.amd.com`** — Retention: forever. Current ROCm Core
release from TheRock. `core/` ships in two variants:
- **standard** — default build packages, asan build packages,
default-debug symbol packages, asan-debug system packages.
- **rpath** — rpath variant of standard packages.
- **`ltsrc.repo.amd.com`** *(future; Retention: 2 years)* —
release-candidate builds for the next LTS release; mirrors
`lts.repo.amd.com` layout.
- **`lts.repo.amd.com`** *(future)* — long-term-support releases.
Adds a `YYYYMM/` subfolder under each artifact type, otherwise
mirrors the `stable` layout.
### Structure on `archives.repo.amd.com`
`archives.repo.amd.com` is a **retention-only** subdomain, not a
release stream. Content is read-only: no new artifacts are published
directly here; everything arrives via migration from one of the
sources below.
**Sources of archived content:**
- **Legacy `repo.amd.com/rocm/`** — the non-production folder on the
bare domain, migrated 6 months after `archives.repo.amd.com` goes
live. Original URLs redirect to `https://archives.repo.amd.com/legacy-rocm/`
preserving the existing path structure so historical documentation
links continue to resolve.
- **`repo.radeon.com` (ROCm content)** — mirroring the historical
ROCm content from `repo.radeon.com` into `archives.repo.amd.com`
is **planned but deferred**. Scope (which subtrees), URL layout,
redirect behavior, GPG key handling, and the migration timeline
are **to be determined in a follow-up discussion** tied to the
AMD GPU driver consolidation into `repo.amd.com` (see *Repository
Package*). This RFC reserves the placement under
`archives.repo.amd.com` for that content; the technical details
are explicitly out of scope here.
`archives.repo.amd.com` holds **only pre-stream-model content** —
artifacts that predate the move to the per-stream subdomain release
model. Aged-out artifacts from the new `<stream>.repo.amd.com`
subdomains are **not** copied here; once a build falls outside its
stream's retention window it is removed. Reproducibility for the new
streams is handled by the per-stream retention windows themselves
(`stable` forever, `rc` 2 years, `nightly` 120 days, etc.), not by
the archive subdomain.
Layout is preserved historically per source and is not constrained by
this RFC's per-subdomain tree. The retention horizon is **indefinite**
— content is not removed once archived, only added.
## Python Indices
ROCm publishes wheels through two parallel multi-arch indices, per the
direction in [ROCm/TheRock#5289](https://github.com/ROCm/TheRock/pull/5289).
Per-family indices were considered and rejected — only the two
multi-arch flavors below are in scope.
> **Implementation details:** the build, sharding, and publish
> mechanics for `whl/` and `whl-next/` are tracked in
> [ROCm/TheRock#5289](https://github.com/ROCm/TheRock/pull/5289).
> That PR is the source of truth for the index generator, the wheel
> selector behavior, and the on-disk layout *under* `whl/` and
> `whl-next/` (which this RFC intentionally leaves as
> implementation-defined).
**`whl/` and `whl-next/` are central** — two PEP 503 simple indices
per stream, sitting directly under each subdomain's `rocm/` tree
(`<stream>.repo.amd.com/rocm/whl/` and
`<stream>.repo.amd.com/rocm/whl-next/`). Each index serves wheels
from every wheel-producing area in that stream (`core/`,
per-expansion folders (`computer-vision-sdk/`,
`rocm-ds/`, …), any extras that ship wheels, `pytorch/`, `jax/`,
`onnx-runtime/`). There is no per-package central index
and no `pyindex/` wrapper. Centralizing the indices lets
`pip install rocm` (and `pip install torch`, `pip install jax`, etc.)
resolve cross-package dependencies in one resolution pass against a
single `--index-url`.
- **`whl/`** — **backward-compatible / all-arch** variant.
`pip install rocm` (or `pip install torch`) pulls in **all** device
extras automatically, matching the "it just works" behavior users
expect from `pip install torch --index-url https://download.pytorch.org/whl/rocm7.2`. Larger download (~5.5 GB
for the torch case), but no architecture knowledge required. This
index is the **default** for users coming from the PyTorch wheel
ecosystem.
```
pip install --index-url https://<stream>.repo.amd.com/rocm/whl/ rocm
```
- **`whl-next/`** — **explicit-device-extras** variant. The user
picks the device extras they need (e.g. `rocm[device-gfx942]`).
Smaller installs, but the user must know their target architecture.
This is the forward-looking shape that will fold into WheelNext
once `uv pip install` with wheel-variant providers ships.
```
pip install --index-url https://<stream>.repo.amd.com/rocm/whl-next/ rocm[device-gfx942]
```
> **Naming note:** `whl/` and `whl-next/` are required and stable —
> they are the public entry points users pass directly to
> `pip install --index-url …/rocm/whl/` or `…/rocm/whl-next/`, and
> are part of the public contract. The layout *under* each (sharding,
> filename conventions) and the layout of the per-component `whl/` +
> `whl-next/` storage folders that back them remain implementation
> details left to the publish tooling and are not required to be
> human-readable.
>
> **No Python-side repo-setup package:** there is no
> `amdrocm-repo-*` Python package (or equivalent) and none is
> planned. The `amdrocm-repo-stable` / `amdrocm-repo-stablerc` /
> `amdrocm-repo-nightly` / `amdrocm-repo-dev` packages are
> **native (rpm/deb) repo-setup packages only** — they configure
> `yum` / `apt` sources and the gpg key, and have no role in the
> Python wheel install path. Users wire up `pip` by passing
> `--index-url` themselves (or by adding the index to their
> `pip.conf` / `requirements.txt`).
Both variants ship under every stream that publishes wheels (`dev`,
`nightly`, `weekly`, `rc`, `stable`; not `ltsrc`/`lts` until LTS
exists), and both are built from the same underlying wheel set —
`whl/` simply republishes the entry-point wheels (`rocm`, `torch`,
`torchvision`, …) with `device-all` added as an automatic requirement,
plus links to the unmodified device wheels in `whl-next/` so storage
is not duplicated.
Future direction: WheelNext (`uv pip install` with a wheel-variant
provider backed by `rocm-bootstrap`) is the long-term plan and will
eventually make `whl/` unnecessary — `whl-next/` becomes the sole
index once WheelNext is widely adopted. Until that lands, both
variants must coexist.
## Third Party AI Forks
`pytorch`, `jax`, and `onnx-runtime` are **ROCm forks/builds of upstream
third-party AI frameworks**, not first-party AMD projects. They are
published on `repo.amd.com` so users can pick up ROCm-enabled wheels
without having to build them locally, but the upstream project owns the
source of truth and the release cadence for the framework itself.
Rules that apply to all third-party AI forks:
- **Upstream tracking:** each entry mirrors a specific upstream release
(or upstream nightly), with ROCm patches applied on top. Metadata in
every artifact records the upstream version and the ROCm version it
was built against.
- **Streams:** published under `nightly/`, `weekly/`, `rc/`, and
`stable/`. **Not** published under `dev/` (per-commit churn is not
useful for fork consumers — the dev gate is too low and the build
cost would be prohibitive). **Not** published under `ltsrc/` or
`lts/` (long-term-support guarantees do not extend to third-party
fork builds).
- **Artifact format:** `whl` only. No tarballs, no native distro
packages — users install via `pip` from the matching ROCm wheel index.
- **Dependency rule:** framework wheels must depend **only on Python
wheels of the ROCm Core SDK** (published under `core/whl/` and
surfaced through the central `whl/` and `whl-next/`).
They must not depend on system packages, native distro packages, or
any non-wheel ROCm artifact. This keeps `pip install` of a framework
wheel fully self-contained and reproducible across distros.
- **Versioning:** uses the upstream framework's own version string
(e.g. PyTorch's `2.x.y+rocm<rocm-version>` convention), not the ROCm
Core SDK `<X.Y>` scheme and not the LTS `<YYYY.MM>` scheme.
- **Support model:** bug fixes for the ROCm-specific delta ship in the
next stream promotion; we do not back-patch older third-party fork
releases.
- **Coverage list:** `pytorch`, `jax`, `onnx-runtime`. New third-party
forks added to `repo.amd.com` follow this same model by default.
## Repository Package
**Defined in a separate RFC** — see
`RFC00XX-Repository-Package.md`. That document is the source of
truth for the `amdrocm-repo-stable`, `amdrocm-repo-stablerc`,
`amdrocm-repo-nightly`, and `amdrocm-repo-dev` tier packages,
including their installed `.repo` / `.sources` filenames, default
enablement, GPG key handling, amdgpu driver pinning per stream,
the `Conflicts:` rule against legacy `amdgpu-install`, and the
deferred LTS placement.
The only repo-package facts this RFC needs to assert are
placement-related and already covered elsewhere in this document:
- **Publication folder.** The tier packages are published in the
singleton `amdrepos/` folder on the bare domain
(`https://repo.amd.com/amdrepos/<distro>/`) — see *Structure on
`repo.amd.com` (bare domain)*. `amdrepos/` is not replicated
under any stream subdomain; there is one canonical copy that
serves all streams.
- **Stream-subdomain pointers.** Each tier package's installed
`baseurl` / `URIs:` resolves to
`https://<stream>.repo.amd.com/...` for the streams it covers
— see *Stream Subdomains* for the subdomain contract.
- **On-disk coexistence.** Streams installed via different tier
packages coexist because each Core SDK build lands in a
stream-distinct, version-scoped path under `/opt/rocm/` — see
*Install Locations (ROCm Core SDK)* in `RFC00XX-Repository-Package.md`.
All other repo-package mechanics (filename scheme, deb822 stanza
shape, default enablement table, rpath sibling, driver-pin churn
isolation, install commands) live in `RFC00XX-Repository-Package.md`
and are not duplicated here.