From 68e701d038cbfbcd384f2299834d8cecca173b83 Mon Sep 17 00:00:00 2001 From: Federico Kamelhar Date: Fri, 18 Sep 2026 14:15:52 -0400 Subject: [PATCH] OCI: offer the H100, H200, L40S, A100-v2, B200, B300 and RTX PRO shapes `SUPPORTED_SHAPE_FAMILIES` in the OCI backend still listed only the GPU shapes that existed when Bare Metal support was added (#1325): GPU3, GPU4 and A10. Every newer NVIDIA shape from the gpuhunt catalog was filtered out by `_supported_instances`, so `dstack apply` could never select an OCI H100, H200, L40S, A100-v2, B200, B300 or RTX PRO 6000 instance even with quota in place. #2343 asked for H100 and was closed as not a priority; the only real blocker at the time, Fabric Manager in the OS images (#2348), was fixed in #2355, and the images now install the open kernel modules and Fabric Manager for the whole CUDA driver line. Add those families. They are all x86-64 hosts with NVIDIA GPUs, which is what the published `dstack-cuda-*` Marketplace images run. Two groups of GPU shapes from the catalog are intentionally still left out, with the reason recorded next to the list so it is not mistaken for an omission: * BM.GPU.MI300X.8 and BM.GPU.MI355X.8 (AMD Instinct): dstack publishes no ROCm image in OCI Marketplace, and `create_instance` picks the CUDA image for every GPU offer. * BM.GPU.GB200.4 and BM.GPU.GB300.4 (Grace superchips): arm64 hosts, and the OCI images are x86-64 only. Also document why `SUPPORTED_REGIONS` is a fixed set of seven regions: the Marketplace community listings that carry the dstack images are regional, and those are the regions they are published in (verified: the `dstack-cuda-0.14` listing is visible in us-chicago-1 and absent in ca-toronto-1). Widening the set requires publishing the images first. Note that the catalog side needs dstackai/gpuhunt to collect the newer shapes; without that, this change only affects H100, H200, L40S and A100-v2, which the catalog already carries. --- .../_internal/core/backends/oci/compute.py | 14 ++++ .../core/backends/oci/configurator.py | 4 +- .../core/backends/oci/test_compute.py | 66 +++++++++++++++++++ 3 files changed, 83 insertions(+), 1 deletion(-) create mode 100644 src/tests/_internal/core/backends/oci/test_compute.py diff --git a/src/dstack/_internal/core/backends/oci/compute.py b/src/dstack/_internal/core/backends/oci/compute.py index ab9be4908b..f5f839771b 100644 --- a/src/dstack/_internal/core/backends/oci/compute.py +++ b/src/dstack/_internal/core/backends/oci/compute.py @@ -35,6 +35,13 @@ from dstack._internal.core.models.resources import Memory, Range from dstack._internal.core.models.runs import JobProvisioningData, Requirements +# Shape families that dstack's x86-64 OCI Marketplace images can run. GPU shapes are limited to +# NVIDIA GPUs on x86-64 hosts because the images ship CUDA drivers only. Other GPU shapes from +# the gpuhunt catalog are deliberately left out: +# - BM.GPU.MI300X.*, BM.GPU.MI355X.* (AMD Instinct): no ROCm image is published, and +# `create_instance` picks the CUDA image for any GPU offer. +# - BM.GPU.GB200.*, BM.GPU.GB300.* (Grace superchips): arm64 hosts, no arm64 image is published. +# See https://docs.oracle.com/en-us/iaas/Content/Compute/References/computeshapes.htm SUPPORTED_SHAPE_FAMILIES = [ "VM.Standard2.", "BM.Standard2.", @@ -48,6 +55,13 @@ "BM.GPU4.", "VM.GPU.A10.", "BM.GPU.A10.", + "BM.GPU.A100-v2.", + "BM.GPU.L40S.", + "BM.GPU.H100.", + "BM.GPU.H200.", + "BM.GPU.B200.", + "BM.GPU.B300.", + "BM.GPU.RTXPRO.", ] CONFIGURABLE_DISK_SIZE = Range[Memory](min=Memory.parse("50GB"), max=Memory.parse("32TB")) diff --git a/src/dstack/_internal/core/backends/oci/configurator.py b/src/dstack/_internal/core/backends/oci/configurator.py index 95696330e7..8fc6aa57c3 100644 --- a/src/dstack/_internal/core/backends/oci/configurator.py +++ b/src/dstack/_internal/core/backends/oci/configurator.py @@ -28,7 +28,9 @@ ) from dstack._internal.core.models.common import validate_extra_ignore, validate_json_extra_ignore -# where dstack images are published +# Regions where dstack publishes its VM images as OCI Marketplace community listings +# (see scripts/oci_image_tools.py). Listings are regional, so instances can only be launched +# in regions that have the images. Extend this set only together with publishing the images. SUPPORTED_REGIONS = frozenset( [ "eu-frankfurt-1", diff --git a/src/tests/_internal/core/backends/oci/test_compute.py b/src/tests/_internal/core/backends/oci/test_compute.py new file mode 100644 index 0000000000..51644c7c3b --- /dev/null +++ b/src/tests/_internal/core/backends/oci/test_compute.py @@ -0,0 +1,66 @@ +import pytest + +from dstack._internal.core.backends.oci.compute import _supported_instances +from dstack._internal.core.models.backends.base import BackendType +from dstack._internal.core.models.instances import ( + InstanceOffer, + InstanceType, + Resources, +) + + +def make_offer(shape_name: str) -> InstanceOffer: + return InstanceOffer( + backend=BackendType.OCI, + instance=InstanceType( + name=shape_name, + resources=Resources(cpus=8, memory_mib=64 * 1024, gpus=[], spot=False), + ), + region="us-chicago-1", + price=1.0, + ) + + +class TestSupportedInstances: + @pytest.mark.parametrize( + "shape_name", + [ + "VM.Standard2.1", + "BM.Standard.E5.192", + "VM.GPU3.1", + "BM.GPU4.8", + "VM.GPU.A10.1", + "BM.GPU.A10.4", + "BM.GPU.A100-v2.8", + "BM.GPU.L40S.4", + "BM.GPU.H100.8", + "BM.GPU.H200.8", + "BM.GPU.B200.8", + "BM.GPU.B300.8", + "BM.GPU.RTXPRO.8", + ], + ) + def test_supported(self, shape_name: str): + assert _supported_instances(make_offer(shape_name)) + + @pytest.mark.parametrize( + "shape_name", + [ + # Flex shapes need OCPU/memory configuration + "VM.Standard.E4.Flex", + "VM.Optimized3.Flex", + # Ampere A1 Arm CPUs and Grace superchips: no arm64 image + "VM.Standard.A1.Flex", + "BM.Standard.A1.160", + "BM.GPU.GB200.4", + "BM.GPU.GB300.4", + # AMD Instinct: no ROCm image + "BM.GPU.MI300X.8", + "BM.GPU.MI355X.8", + # Deprecated families + "BM.GPU2.2", + "VM.GPU2.1", + ], + ) + def test_unsupported(self, shape_name: str): + assert not _supported_instances(make_offer(shape_name))