From 6e45c61638b97e3030ff83f8058589f46f2419ea Mon Sep 17 00:00:00 2001 From: LeoBorcherding Date: Thu, 10 Sep 2026 10:26:39 -0500 Subject: [PATCH 1/6] fix(AMD): recognise the RX 6950 XT, 6850M XT and 6550M instead of leaving them on CPU torch The seven copies of the AMD marketing-name to gfx table cover the launch RDNA 2 parts and not the refresh ones, which carry their own model number: RX 6950 XT (Navi 21), RX 6850M XT (Navi 22) and RX 6550M (Navi 24) matched no arm. On a host where the name is the only arch source -- Windows with the Adrenalin driver and no HIP SDK -- that means no arch, so CPU-only torch on a card the gfx103X-all index does cover. The same table decides whether Settings > System can report a card PyTorch cannot use, so the gap also cost the message: an unmatched adapter reads as one the stack declines on purpose, and the panel falls through to a bare "No visible GPU" beside a card the OS is listing. Adds the three names to all seven copies, a parity case for each so a future copy that misses one fails naming the file, and a backend test pinning that a Windows adapter named only by its marketing string establishes a mismatch. --- install.ps1 | 4 +-- install.sh | 8 +++--- .../test_torch_cpu_build_on_nvidia_host.py | 27 +++++++++++++++++++ studio/backend/utils/hardware/hardware.py | 4 +-- studio/install_python_stack.py | 8 ++++-- studio/setup.ps1 | 4 +-- studio/setup.sh | 4 +-- .../install/test_rocm_arch_table_parity.py | 5 ++++ tests/studio/test_amd_name_arch_r9700.ps1 | 4 +++ 9 files changed, 54 insertions(+), 14 deletions(-) diff --git a/install.ps1 b/install.ps1 index e65a6a03b5b..d2f154bee01 100644 --- a/install.ps1 +++ b/install.ps1 @@ -5374,9 +5374,9 @@ exit 0 @{ P = "RX 7800|RX 7700(?!S)|PRO W7700|PRO V710"; A = "gfx1101" } # RDNA 3 (Navi 32) @{ P = "RX 7600|RX 7700S|RX 7650|PRO W7600|PRO W7500"; A = "gfx1102" } # RDNA 3 (Navi 33) @{ P = "780M|760M|740M|Phoenix|Hawk Point|Z1 Extreme|Z2 Extreme"; A = "gfx1103" } # RDNA 3 iGPU (Phoenix / Hawk Point) - @{ P = "RX 6900|RX 6800|RX 6750|RX 6700|PRO W6800|PRO W6900"; A = "gfx1030" } # RDNA 2 (Navi 21) -- gfx103X family + @{ P = "RX 6950|RX 6900|RX 6850|RX 6800|RX 6750|RX 6700|PRO W6800|PRO W6900"; A = "gfx1030" } # RDNA 2 (Navi 21) -- gfx103X family @{ P = "RX 6650|RX 6600|PRO W6600|PRO W6650"; A = "gfx1032" } # RDNA 2 (Navi 23) -- gfx103X family - @{ P = "RX 6500|RX 6400|RX 6300|PRO W6400|PRO W6500"; A = "gfx1034" } # RDNA 2 (Navi 24) -- gfx103X family + @{ P = "RX 6550|RX 6500|RX 6400|RX 6300|PRO W6400|PRO W6500"; A = "gfx1034" } # RDNA 2 (Navi 24) -- gfx103X family ) foreach ($row in $nameArchTable) { if ($ROCmGpuLabel -match $row.P) { diff --git a/install.sh b/install.sh index 120a3cd9434..07bd5f8f543 100755 --- a/install.sh +++ b/install.sh @@ -3132,9 +3132,9 @@ _infer_amd_gfx_arch_from_gpu_name() { *"RX 7800"*|*"RX 7700"*|*"PRO W7700"*|*"PRO V710"*) echo gfx1101 ;; *"RX 7900"*|*"PRO W7900"*|*"PRO W7800"*) echo gfx1100 ;; *"780M"*|*"760M"*|*"740M"*|*"Phoenix"*|*"Hawk Point"*|*"Z1 Extreme"*|*"Z2 Extreme"*) echo gfx1103 ;; - *"RX 6900"*|*"RX 6800"*|*"RX 6750"*|*"RX 6700"*|*"PRO W6800"*|*"PRO W6900"*) echo gfx1030 ;; + *"RX 6950"*|*"RX 6900"*|*"RX 6850"*|*"RX 6800"*|*"RX 6750"*|*"RX 6700"*|*"PRO W6800"*|*"PRO W6900"*) echo gfx1030 ;; *"RX 6650"*|*"RX 6600"*|*"PRO W6600"*|*"PRO W6650"*) echo gfx1032 ;; - *"RX 6500"*|*"RX 6400"*|*"RX 6300"*|*"PRO W6400"*|*"PRO W6500"*) echo gfx1034 ;; + *"RX 6550"*|*"RX 6500"*|*"RX 6400"*|*"RX 6300"*|*"PRO W6400"*|*"PRO W6500"*) echo gfx1034 ;; *) return 1 ;; esac } @@ -4652,9 +4652,9 @@ elif case "$TORCH_INDEX_URL" in */rocm*|*/gfx*) true ;; *) false ;; esac; then *"RX 7800"*|*"RX 7700"*|*"PRO W7700"*|*"PRO V710"*) _gpu_disp_gfx="gfx1101" ;; # RDNA 3 (Navi 32) *"RX 7900"*|*"PRO W7900"*|*"PRO W7800"*) _gpu_disp_gfx="gfx1100" ;; # RDNA 3 desktop / workstation (Navi 31) *"780M"*|*"760M"*|*"740M"*|*"Phoenix"*|*"Hawk Point"*|*"Z1 Extreme"*|*"Z2 Extreme"*) _gpu_disp_gfx="gfx1103" ;; # RDNA 3 iGPU (Phoenix / Hawk Point) - *"RX 6900"*|*"RX 6800"*|*"RX 6750"*|*"RX 6700"*|*"PRO W6800"*|*"PRO W6900"*) _gpu_disp_gfx="gfx1030" ;; # RDNA 2 (Navi 21) + *"RX 6950"*|*"RX 6900"*|*"RX 6850"*|*"RX 6800"*|*"RX 6750"*|*"RX 6700"*|*"PRO W6800"*|*"PRO W6900"*) _gpu_disp_gfx="gfx1030" ;; # RDNA 2 (Navi 21) *"RX 6650"*|*"RX 6600"*|*"PRO W6600"*|*"PRO W6650"*) _gpu_disp_gfx="gfx1032" ;; # RDNA 2 (Navi 23) - *"RX 6500"*|*"RX 6400"*|*"RX 6300"*|*"PRO W6400"*|*"PRO W6500"*) _gpu_disp_gfx="gfx1034" ;; # RDNA 2 (Navi 24) + *"RX 6550"*|*"RX 6500"*|*"RX 6400"*|*"RX 6300"*|*"PRO W6400"*|*"PRO W6500"*) _gpu_disp_gfx="gfx1034" ;; # RDNA 2 (Navi 24) esac if [ -n "$_gpu_disp_gfx" ]; then substep "gfx arch inferred from GPU name: $_gpu_disp_gfx" diff --git a/studio/backend/tests/test_torch_cpu_build_on_nvidia_host.py b/studio/backend/tests/test_torch_cpu_build_on_nvidia_host.py index b3b68853239..1a180315281 100644 --- a/studio/backend/tests/test_torch_cpu_build_on_nvidia_host.py +++ b/studio/backend/tests/test_torch_cpu_build_on_nvidia_host.py @@ -1179,6 +1179,33 @@ def test_an_ordinary_intel_igpu_does_not_establish_a_mismatch(monkeypatch, tmp_p assert hw._devices_that_can_establish_a_mismatch(others) == others +def test_an_amd_card_named_only_by_its_marketing_string_establishes_a_mismatch( + monkeypatch, tmp_path +): + """A Windows driver that wrote no AdapterFamily leaves the name as the only arch source. + + Silence here is the worst of both: the card is one the installers do ship a wheel for, + so leaving it out of the mismatch drops it from Settings > System entirely and the panel + says "No visible GPU" beside a card the OS is listing (#10468). The name table decides, + which is why a gap in it costs the message as well as the wheel. + """ + _shared_setup_1(monkeypatch, tmp_path) + monkeypatch.setattr(hw, "_linux_kfd_reports_an_amd_gpu", lambda: False) + + covered = [ + {"vendor": "amd", "name": "AMD Radeon RX 6950 XT", "index": 0, "gfx_candidates": []}, + {"vendor": "amd", "name": "AMD Radeon RX 6850M XT", "index": 0, "gfx_candidates": []}, + {"vendor": "amd", "name": "AMD Radeon RX 6550M", "index": 0, "gfx_candidates": []}, + ] + for device in covered: + assert hw._devices_that_can_establish_a_mismatch([device]) == [device], device["name"] + + # The other direction still holds: RDNA 1 is declined on purpose, so it must stay quiet + # rather than offer a repair that reinstalls the same CPU wheel. + declined = [{"vendor": "amd", "name": "AMD Radeon RX 5700 XT", "index": 0, "gfx_candidates": []}] + assert hw._devices_that_can_establish_a_mismatch(declined) == [] + + def test_a_nameless_intel_card_counts_once_xpu_was_actually_chosen(monkeypatch, tmp_path): sys = _shared_setup_1(monkeypatch, tmp_path) monkeypatch.delenv("UNSLOTH_TORCH_INDEX_URL", raising = False) diff --git a/studio/backend/utils/hardware/hardware.py b/studio/backend/utils/hardware/hardware.py index fb4a91241f5..8b89b0e4651 100644 --- a/studio/backend/utils/hardware/hardware.py +++ b/studio/backend/utils/hardware/hardware.py @@ -942,9 +942,9 @@ def _torch_reports_a_hip_runtime() -> bool: (r"RX 7800|RX 7700(?!S)|PRO W7700|PRO V710", "gfx1101"), (r"RX 7600|RX 7700S|RX 7650|PRO W7600|PRO W7500", "gfx1102"), (r"780M|760M|740M|Phoenix|Hawk Point|Z1 Extreme|Z2 Extreme", "gfx1103"), - (r"RX 6900|RX 6800|RX 6750|RX 6700|PRO W6800|PRO W6900", "gfx1030"), + (r"RX 6950|RX 6900|RX 6850|RX 6800|RX 6750|RX 6700|PRO W6800|PRO W6900", "gfx1030"), (r"RX 6650|RX 6600|PRO W6600|PRO W6650", "gfx1032"), - (r"RX 6500|RX 6400|RX 6300|PRO W6400|PRO W6500", "gfx1034"), + (r"RX 6550|RX 6500|RX 6400|RX 6300|PRO W6400|PRO W6500", "gfx1034"), ] diff --git a/studio/install_python_stack.py b/studio/install_python_stack.py index 147bd8641d9..e96a55734d6 100644 --- a/studio/install_python_stack.py +++ b/studio/install_python_stack.py @@ -1674,9 +1674,13 @@ def _dedup_pick( (r"RX 7600|RX 7700S|RX 7650|PRO W7600|PRO W7500", "gfx1102"), # Navi 33 # RDNA 3 iGPU (Phoenix / Hawk Point) (r"780M|760M|740M|Phoenix|Hawk Point|Z1 Extreme|Z2 Extreme", "gfx1103"), - (r"RX 6900|RX 6800|RX 6750|RX 6700|PRO W6800|PRO W6900", "gfx1030"), # Navi 21 + # RDNA 2. The refresh parts carry their own number, matched nothing, and took CPU torch on + # hosts where the name is the only arch source (#10468): 6950 XT, 6850M XT, 6550M. 6850M XT + # is Navi 22 and joins the 6750 / 6700 arm as those already do -- every RDNA 2 row resolves + # to gfx103X-all, so the exact id picks no different wheel. + (r"RX 6950|RX 6900|RX 6850|RX 6800|RX 6750|RX 6700|PRO W6800|PRO W6900", "gfx1030"), # Navi 21 (r"RX 6650|RX 6600|PRO W6600|PRO W6650", "gfx1032"), # Navi 23 - (r"RX 6500|RX 6400|RX 6300|PRO W6400|PRO W6500", "gfx1034"), # Navi 24 + (r"RX 6550|RX 6500|RX 6400|RX 6300|PRO W6400|PRO W6500", "gfx1034"), # Navi 24 ] diff --git a/studio/setup.ps1 b/studio/setup.ps1 index f439fab17ef..368f36d8760 100644 --- a/studio/setup.ps1 +++ b/studio/setup.ps1 @@ -2736,9 +2736,9 @@ if (-not $HasNvidiaSmi) { @{ P = "RX 7800|RX 7700(?!S)|PRO W7700|PRO V710"; A = "gfx1101" } # RDNA 3 (Navi 32) @{ P = "RX 7600|RX 7700S|RX 7650|PRO W7600|PRO W7500"; A = "gfx1102" } # RDNA 3 (Navi 33) @{ P = "780M|760M|740M|Phoenix|Hawk Point|Z1 Extreme|Z2 Extreme"; A = "gfx1103" } # RDNA 3 iGPU (Phoenix / Hawk Point) - @{ P = "RX 6900|RX 6800|RX 6750|RX 6700|PRO W6800|PRO W6900"; A = "gfx1030" } # RDNA 2 (Navi 21) -- gfx103X family + @{ P = "RX 6950|RX 6900|RX 6850|RX 6800|RX 6750|RX 6700|PRO W6800|PRO W6900"; A = "gfx1030" } # RDNA 2 (Navi 21) -- gfx103X family @{ P = "RX 6650|RX 6600|PRO W6600|PRO W6650"; A = "gfx1032" } # RDNA 2 (Navi 23) -- gfx103X family - @{ P = "RX 6500|RX 6400|RX 6300|PRO W6400|PRO W6500"; A = "gfx1034" } # RDNA 2 (Navi 24) -- gfx103X family + @{ P = "RX 6550|RX 6500|RX 6400|RX 6300|PRO W6400|PRO W6500"; A = "gfx1034" } # RDNA 2 (Navi 24) -- gfx103X family ) function Get-GfxArchFromGpuName { param([AllowNull()][string]$Name, [object[]]$Table) diff --git a/studio/setup.sh b/studio/setup.sh index a196dc2ce6a..028e43032f3 100755 --- a/studio/setup.sh +++ b/studio/setup.sh @@ -2323,9 +2323,9 @@ _setup_supported_gfx_from_name() { *"RX 7800"*|*"RX 7700"*|*"PRO W7700"*|*"PRO V710"*) _sup_gfx_out="gfx1101" ;; # RDNA 3 (Navi 32) *"RX 7900"*|*"PRO W7900"*|*"PRO W7800"*) _sup_gfx_out="gfx1100" ;; # RDNA 3 desktop / workstation (Navi 31) *"780M"*|*"760M"*|*"740M"*|*"Phoenix"*|*"Hawk Point"*|*"Z1 Extreme"*|*"Z2 Extreme"*) _sup_gfx_out="gfx1103" ;; # RDNA 3 iGPU (Phoenix / Hawk Point) - *"RX 6900"*|*"RX 6800"*|*"RX 6750"*|*"RX 6700"*|*"PRO W6800"*|*"PRO W6900"*) _sup_gfx_out="gfx1030" ;; # RDNA 2 (Navi 21) + *"RX 6950"*|*"RX 6900"*|*"RX 6850"*|*"RX 6800"*|*"RX 6750"*|*"RX 6700"*|*"PRO W6800"*|*"PRO W6900"*) _sup_gfx_out="gfx1030" ;; # RDNA 2 (Navi 21) *"RX 6650"*|*"RX 6600"*|*"PRO W6600"*|*"PRO W6650"*) _sup_gfx_out="gfx1032" ;; # RDNA 2 (Navi 23) - *"RX 6500"*|*"RX 6400"*|*"RX 6300"*|*"PRO W6400"*|*"PRO W6500"*) _sup_gfx_out="gfx1034" ;; # RDNA 2 (Navi 24) + *"RX 6550"*|*"RX 6500"*|*"RX 6400"*|*"RX 6300"*|*"PRO W6400"*|*"PRO W6500"*) _sup_gfx_out="gfx1034" ;; # RDNA 2 (Navi 24) esac [ -n "$_sup_gfx_out" ] || return 1 printf '%s\n' "$_sup_gfx_out" diff --git a/tests/studio/install/test_rocm_arch_table_parity.py b/tests/studio/install/test_rocm_arch_table_parity.py index f1313276fbd..463fe7e7534 100644 --- a/tests/studio/install/test_rocm_arch_table_parity.py +++ b/tests/studio/install/test_rocm_arch_table_parity.py @@ -306,6 +306,11 @@ def _match_ps(rows: list[tuple[str, str]], gpu_name: str) -> str | None: ("AMD Radeon RX 6700 XT", "gfx103X-all"), ("AMD Radeon RX 6600 XT", "gfx103X-all"), ("AMD Radeon RX 6500 XT", "gfx103X-all"), + # The RDNA 2 refresh parts, which hold their own number rather than the one already listed. + # All three matched nothing in all seven copies and took CPU torch (#10468). + ("AMD Radeon RX 6950 XT", "gfx103X-all"), + ("AMD Radeon RX 6850M XT", "gfx103X-all"), + ("AMD Radeon RX 6550M", "gfx103X-all"), ] # Exact gfx ids, transcribed from AMD's ROCm compatibility matrix (the "Radeon GPU" list at diff --git a/tests/studio/test_amd_name_arch_r9700.ps1 b/tests/studio/test_amd_name_arch_r9700.ps1 index 57899b86c0e..303d217f1e7 100644 --- a/tests/studio/test_amd_name_arch_r9700.ps1 +++ b/tests/studio/test_amd_name_arch_r9700.ps1 @@ -71,6 +71,10 @@ $otherNames = @( @{ N = "AMD Radeon RX 6900 XT"; A = "gfx1030" }, @{ N = "AMD Radeon RX 6600 XT"; A = "gfx1032" }, @{ N = "AMD Radeon RX 6500 XT"; A = "gfx1034" }, + # RDNA 2 refresh parts: their own number, so the arms above never covered them (#10468). + @{ N = "AMD Radeon RX 6950 XT"; A = "gfx1030" }, + @{ N = "AMD Radeon RX 6850M XT"; A = "gfx1030" }, + @{ N = "AMD Radeon RX 6550M"; A = "gfx1034" }, @{ N = "ATI Radeon 9700 PRO"; A = $null }, @{ N = "ATI Radeon 9800 PRO"; A = $null }, @{ N = "AMD Radeon R9 Fury X"; A = $null }, From 3eea75e008df4cb1342700ec7826b16174a3c275 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 10 Sep 2026 20:41:06 +0000 Subject: [PATCH 2/6] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- studio/backend/tests/test_torch_cpu_build_on_nvidia_host.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/studio/backend/tests/test_torch_cpu_build_on_nvidia_host.py b/studio/backend/tests/test_torch_cpu_build_on_nvidia_host.py index 1a180315281..01f7eb67cfa 100644 --- a/studio/backend/tests/test_torch_cpu_build_on_nvidia_host.py +++ b/studio/backend/tests/test_torch_cpu_build_on_nvidia_host.py @@ -1202,7 +1202,9 @@ def test_an_amd_card_named_only_by_its_marketing_string_establishes_a_mismatch( # The other direction still holds: RDNA 1 is declined on purpose, so it must stay quiet # rather than offer a repair that reinstalls the same CPU wheel. - declined = [{"vendor": "amd", "name": "AMD Radeon RX 5700 XT", "index": 0, "gfx_candidates": []}] + declined = [ + {"vendor": "amd", "name": "AMD Radeon RX 5700 XT", "index": 0, "gfx_candidates": []} + ] assert hw._devices_that_can_establish_a_mismatch(declined) == [] From cb1af47bc853ee81585fe3d7a3077ecb4ee3e2bb Mon Sep 17 00:00:00 2001 From: danielhanchen Date: Mon, 14 Sep 2026 06:54:52 +0000 Subject: [PATCH 3/6] Recognise the RX 6450M and PRO W6300 as well --- install.ps1 | 2 +- install.sh | 4 ++-- studio/backend/utils/hardware/hardware.py | 2 +- studio/install_python_stack.py | 2 +- studio/setup.ps1 | 2 +- studio/setup.sh | 2 +- tests/studio/install/test_rocm_arch_table_parity.py | 4 ++++ tests/studio/test_amd_name_arch_r9700.ps1 | 2 ++ 8 files changed, 13 insertions(+), 7 deletions(-) diff --git a/install.ps1 b/install.ps1 index bb275d13600..43e4020bb73 100644 --- a/install.ps1 +++ b/install.ps1 @@ -5625,7 +5625,7 @@ exit 0 @{ P = "780M|760M|740M|Phoenix|Hawk Point|Z1 Extreme|Z2 Extreme"; A = "gfx1103" } # RDNA 3 iGPU (Phoenix / Hawk Point) @{ P = "RX 6950|RX 6900|RX 6850|RX 6800|RX 6750|RX 6700|PRO W6800|PRO W6900"; A = "gfx1030" } # RDNA 2 (Navi 21) -- gfx103X family @{ P = "RX 6650|RX 6600|PRO W6600|PRO W6650"; A = "gfx1032" } # RDNA 2 (Navi 23) -- gfx103X family - @{ P = "RX 6550|RX 6500|RX 6400|RX 6300|PRO W6400|PRO W6500"; A = "gfx1034" } # RDNA 2 (Navi 24) -- gfx103X family + @{ P = "RX 6550|RX 6500|RX 6450|RX 6400|RX 6300|PRO W6400|PRO W6500|PRO W6300"; A = "gfx1034" } # RDNA 2 (Navi 24) -- gfx103X family ) foreach ($row in $nameArchTable) { if ($ROCmGpuLabel -match $row.P) { diff --git a/install.sh b/install.sh index 9bffa907508..5d6249086de 100755 --- a/install.sh +++ b/install.sh @@ -3412,7 +3412,7 @@ _infer_amd_gfx_arch_from_gpu_name() { *"780M"*|*"760M"*|*"740M"*|*"Phoenix"*|*"Hawk Point"*|*"Z1 Extreme"*|*"Z2 Extreme"*) echo gfx1103 ;; *"RX 6950"*|*"RX 6900"*|*"RX 6850"*|*"RX 6800"*|*"RX 6750"*|*"RX 6700"*|*"PRO W6800"*|*"PRO W6900"*) echo gfx1030 ;; *"RX 6650"*|*"RX 6600"*|*"PRO W6600"*|*"PRO W6650"*) echo gfx1032 ;; - *"RX 6550"*|*"RX 6500"*|*"RX 6400"*|*"RX 6300"*|*"PRO W6400"*|*"PRO W6500"*) echo gfx1034 ;; + *"RX 6550"*|*"RX 6500"*|*"RX 6450"*|*"RX 6400"*|*"RX 6300"*|*"PRO W6400"*|*"PRO W6500"*|*"PRO W6300"*) echo gfx1034 ;; *) return 1 ;; esac } @@ -4932,7 +4932,7 @@ elif case "$TORCH_INDEX_URL" in */rocm*|*/gfx*) true ;; *) false ;; esac; then *"780M"*|*"760M"*|*"740M"*|*"Phoenix"*|*"Hawk Point"*|*"Z1 Extreme"*|*"Z2 Extreme"*) _gpu_disp_gfx="gfx1103" ;; # RDNA 3 iGPU (Phoenix / Hawk Point) *"RX 6950"*|*"RX 6900"*|*"RX 6850"*|*"RX 6800"*|*"RX 6750"*|*"RX 6700"*|*"PRO W6800"*|*"PRO W6900"*) _gpu_disp_gfx="gfx1030" ;; # RDNA 2 (Navi 21) *"RX 6650"*|*"RX 6600"*|*"PRO W6600"*|*"PRO W6650"*) _gpu_disp_gfx="gfx1032" ;; # RDNA 2 (Navi 23) - *"RX 6550"*|*"RX 6500"*|*"RX 6400"*|*"RX 6300"*|*"PRO W6400"*|*"PRO W6500"*) _gpu_disp_gfx="gfx1034" ;; # RDNA 2 (Navi 24) + *"RX 6550"*|*"RX 6500"*|*"RX 6450"*|*"RX 6400"*|*"RX 6300"*|*"PRO W6400"*|*"PRO W6500"*|*"PRO W6300"*) _gpu_disp_gfx="gfx1034" ;; # RDNA 2 (Navi 24) esac if [ -n "$_gpu_disp_gfx" ]; then substep "gfx arch inferred from GPU name: $_gpu_disp_gfx" diff --git a/studio/backend/utils/hardware/hardware.py b/studio/backend/utils/hardware/hardware.py index 8e58845d689..9ccfc82d56e 100644 --- a/studio/backend/utils/hardware/hardware.py +++ b/studio/backend/utils/hardware/hardware.py @@ -944,7 +944,7 @@ def _torch_reports_a_hip_runtime() -> bool: (r"780M|760M|740M|Phoenix|Hawk Point|Z1 Extreme|Z2 Extreme", "gfx1103"), (r"RX 6950|RX 6900|RX 6850|RX 6800|RX 6750|RX 6700|PRO W6800|PRO W6900", "gfx1030"), (r"RX 6650|RX 6600|PRO W6600|PRO W6650", "gfx1032"), - (r"RX 6550|RX 6500|RX 6400|RX 6300|PRO W6400|PRO W6500", "gfx1034"), + (r"RX 6550|RX 6500|RX 6450|RX 6400|RX 6300|PRO W6400|PRO W6500|PRO W6300", "gfx1034"), ] diff --git a/studio/install_python_stack.py b/studio/install_python_stack.py index e96a55734d6..908772e7837 100644 --- a/studio/install_python_stack.py +++ b/studio/install_python_stack.py @@ -1680,7 +1680,7 @@ def _dedup_pick( # to gfx103X-all, so the exact id picks no different wheel. (r"RX 6950|RX 6900|RX 6850|RX 6800|RX 6750|RX 6700|PRO W6800|PRO W6900", "gfx1030"), # Navi 21 (r"RX 6650|RX 6600|PRO W6600|PRO W6650", "gfx1032"), # Navi 23 - (r"RX 6550|RX 6500|RX 6400|RX 6300|PRO W6400|PRO W6500", "gfx1034"), # Navi 24 + (r"RX 6550|RX 6500|RX 6450|RX 6400|RX 6300|PRO W6400|PRO W6500|PRO W6300", "gfx1034"), # Navi 24 ] diff --git a/studio/setup.ps1 b/studio/setup.ps1 index 368f36d8760..f2aefbc9ff1 100644 --- a/studio/setup.ps1 +++ b/studio/setup.ps1 @@ -2738,7 +2738,7 @@ if (-not $HasNvidiaSmi) { @{ P = "780M|760M|740M|Phoenix|Hawk Point|Z1 Extreme|Z2 Extreme"; A = "gfx1103" } # RDNA 3 iGPU (Phoenix / Hawk Point) @{ P = "RX 6950|RX 6900|RX 6850|RX 6800|RX 6750|RX 6700|PRO W6800|PRO W6900"; A = "gfx1030" } # RDNA 2 (Navi 21) -- gfx103X family @{ P = "RX 6650|RX 6600|PRO W6600|PRO W6650"; A = "gfx1032" } # RDNA 2 (Navi 23) -- gfx103X family - @{ P = "RX 6550|RX 6500|RX 6400|RX 6300|PRO W6400|PRO W6500"; A = "gfx1034" } # RDNA 2 (Navi 24) -- gfx103X family + @{ P = "RX 6550|RX 6500|RX 6450|RX 6400|RX 6300|PRO W6400|PRO W6500|PRO W6300"; A = "gfx1034" } # RDNA 2 (Navi 24) -- gfx103X family ) function Get-GfxArchFromGpuName { param([AllowNull()][string]$Name, [object[]]$Table) diff --git a/studio/setup.sh b/studio/setup.sh index 028e43032f3..ce9112424fb 100755 --- a/studio/setup.sh +++ b/studio/setup.sh @@ -2325,7 +2325,7 @@ _setup_supported_gfx_from_name() { *"780M"*|*"760M"*|*"740M"*|*"Phoenix"*|*"Hawk Point"*|*"Z1 Extreme"*|*"Z2 Extreme"*) _sup_gfx_out="gfx1103" ;; # RDNA 3 iGPU (Phoenix / Hawk Point) *"RX 6950"*|*"RX 6900"*|*"RX 6850"*|*"RX 6800"*|*"RX 6750"*|*"RX 6700"*|*"PRO W6800"*|*"PRO W6900"*) _sup_gfx_out="gfx1030" ;; # RDNA 2 (Navi 21) *"RX 6650"*|*"RX 6600"*|*"PRO W6600"*|*"PRO W6650"*) _sup_gfx_out="gfx1032" ;; # RDNA 2 (Navi 23) - *"RX 6550"*|*"RX 6500"*|*"RX 6400"*|*"RX 6300"*|*"PRO W6400"*|*"PRO W6500"*) _sup_gfx_out="gfx1034" ;; # RDNA 2 (Navi 24) + *"RX 6550"*|*"RX 6500"*|*"RX 6450"*|*"RX 6400"*|*"RX 6300"*|*"PRO W6400"*|*"PRO W6500"*|*"PRO W6300"*) _sup_gfx_out="gfx1034" ;; # RDNA 2 (Navi 24) esac [ -n "$_sup_gfx_out" ] || return 1 printf '%s\n' "$_sup_gfx_out" diff --git a/tests/studio/install/test_rocm_arch_table_parity.py b/tests/studio/install/test_rocm_arch_table_parity.py index 463fe7e7534..16025b1745e 100644 --- a/tests/studio/install/test_rocm_arch_table_parity.py +++ b/tests/studio/install/test_rocm_arch_table_parity.py @@ -311,6 +311,10 @@ def _match_ps(rows: list[tuple[str, str]], gpu_name: str) -> str | None: ("AMD Radeon RX 6950 XT", "gfx103X-all"), ("AMD Radeon RX 6850M XT", "gfx103X-all"), ("AMD Radeon RX 6550M", "gfx103X-all"), + # The rest of the Navi 24 line, found the same way: enumerating the shipped RDNA 2 + # SKUs against the table shows these two were the only remaining names it missed. + ("AMD Radeon RX 6450M", "gfx103X-all"), + ("AMD Radeon PRO W6300", "gfx103X-all"), ] # Exact gfx ids, transcribed from AMD's ROCm compatibility matrix (the "Radeon GPU" list at diff --git a/tests/studio/test_amd_name_arch_r9700.ps1 b/tests/studio/test_amd_name_arch_r9700.ps1 index 303d217f1e7..5986bc3cbb3 100644 --- a/tests/studio/test_amd_name_arch_r9700.ps1 +++ b/tests/studio/test_amd_name_arch_r9700.ps1 @@ -75,6 +75,8 @@ $otherNames = @( @{ N = "AMD Radeon RX 6950 XT"; A = "gfx1030" }, @{ N = "AMD Radeon RX 6850M XT"; A = "gfx1030" }, @{ N = "AMD Radeon RX 6550M"; A = "gfx1034" }, + @{ N = "AMD Radeon RX 6450M"; A = "gfx1034" }, + @{ N = "AMD Radeon PRO W6300"; A = "gfx1034" }, @{ N = "ATI Radeon 9700 PRO"; A = $null }, @{ N = "ATI Radeon 9800 PRO"; A = $null }, @{ N = "AMD Radeon R9 Fury X"; A = $null }, From 4e987130d880e9257d612d3661262c8f833ca209 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 14 Sep 2026 07:33:20 +0000 Subject: [PATCH 4/6] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- studio/install_python_stack.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/studio/install_python_stack.py b/studio/install_python_stack.py index 908772e7837..76c25c7b9c1 100644 --- a/studio/install_python_stack.py +++ b/studio/install_python_stack.py @@ -1680,7 +1680,10 @@ def _dedup_pick( # to gfx103X-all, so the exact id picks no different wheel. (r"RX 6950|RX 6900|RX 6850|RX 6800|RX 6750|RX 6700|PRO W6800|PRO W6900", "gfx1030"), # Navi 21 (r"RX 6650|RX 6600|PRO W6600|PRO W6650", "gfx1032"), # Navi 23 - (r"RX 6550|RX 6500|RX 6450|RX 6400|RX 6300|PRO W6400|PRO W6500|PRO W6300", "gfx1034"), # Navi 24 + ( + r"RX 6550|RX 6500|RX 6450|RX 6400|RX 6300|PRO W6400|PRO W6500|PRO W6300", + "gfx1034", + ), # Navi 24 ] From b7ce811ad4d8a8dedbb439ec2f884d47431f742b Mon Sep 17 00:00:00 2001 From: danielhanchen Date: Mon, 14 Sep 2026 09:13:24 +0000 Subject: [PATCH 5/6] Tighten the comments this change adds Comments only, no behaviour change. Keeps every load-bearing fact: the issue number, that 6850M XT is Navi 22 filed under the Navi 21 arm deliberately, that every RDNA 2 row resolves to gfx103X-all so the exact id picks no different wheel, and that RDNA 1 stays declined on purpose. --- .../tests/test_torch_cpu_build_on_nvidia_host.py | 10 ++++------ studio/install_python_stack.py | 7 +++---- tests/studio/install/test_rocm_arch_table_parity.py | 7 +++---- 3 files changed, 10 insertions(+), 14 deletions(-) diff --git a/studio/backend/tests/test_torch_cpu_build_on_nvidia_host.py b/studio/backend/tests/test_torch_cpu_build_on_nvidia_host.py index 01f7eb67cfa..fe18d47137e 100644 --- a/studio/backend/tests/test_torch_cpu_build_on_nvidia_host.py +++ b/studio/backend/tests/test_torch_cpu_build_on_nvidia_host.py @@ -1184,10 +1184,9 @@ def test_an_amd_card_named_only_by_its_marketing_string_establishes_a_mismatch( ): """A Windows driver that wrote no AdapterFamily leaves the name as the only arch source. - Silence here is the worst of both: the card is one the installers do ship a wheel for, - so leaving it out of the mismatch drops it from Settings > System entirely and the panel - says "No visible GPU" beside a card the OS is listing (#10468). The name table decides, - which is why a gap in it costs the message as well as the wheel. + Dropping a card the installers do ship a wheel for also drops it from Settings > System, + so the panel reads "No visible GPU" beside a card the OS lists (#10468). The name table + decides both, so a gap in it costs the message as well as the wheel. """ _shared_setup_1(monkeypatch, tmp_path) monkeypatch.setattr(hw, "_linux_kfd_reports_an_amd_gpu", lambda: False) @@ -1200,8 +1199,7 @@ def test_an_amd_card_named_only_by_its_marketing_string_establishes_a_mismatch( for device in covered: assert hw._devices_that_can_establish_a_mismatch([device]) == [device], device["name"] - # The other direction still holds: RDNA 1 is declined on purpose, so it must stay quiet - # rather than offer a repair that reinstalls the same CPU wheel. + # RDNA 1 is declined on purpose: a repair here would reinstall the same CPU wheel. declined = [ {"vendor": "amd", "name": "AMD Radeon RX 5700 XT", "index": 0, "gfx_candidates": []} ] diff --git a/studio/install_python_stack.py b/studio/install_python_stack.py index 76c25c7b9c1..6ad50e97bbb 100644 --- a/studio/install_python_stack.py +++ b/studio/install_python_stack.py @@ -1674,10 +1674,9 @@ def _dedup_pick( (r"RX 7600|RX 7700S|RX 7650|PRO W7600|PRO W7500", "gfx1102"), # Navi 33 # RDNA 3 iGPU (Phoenix / Hawk Point) (r"780M|760M|740M|Phoenix|Hawk Point|Z1 Extreme|Z2 Extreme", "gfx1103"), - # RDNA 2. The refresh parts carry their own number, matched nothing, and took CPU torch on - # hosts where the name is the only arch source (#10468): 6950 XT, 6850M XT, 6550M. 6850M XT - # is Navi 22 and joins the 6750 / 6700 arm as those already do -- every RDNA 2 row resolves - # to gfx103X-all, so the exact id picks no different wheel. + # RDNA 2 refresh parts carry their own number, so 6950 XT / 6850M XT / 6550M matched nothing + # and took CPU torch where the name is the only arch source (#10468). 6850M XT is Navi 22, + # filed here as 6750 / 6700 already are: every RDNA 2 row resolves to gfx103X-all. (r"RX 6950|RX 6900|RX 6850|RX 6800|RX 6750|RX 6700|PRO W6800|PRO W6900", "gfx1030"), # Navi 21 (r"RX 6650|RX 6600|PRO W6600|PRO W6650", "gfx1032"), # Navi 23 ( diff --git a/tests/studio/install/test_rocm_arch_table_parity.py b/tests/studio/install/test_rocm_arch_table_parity.py index 16025b1745e..196db25056c 100644 --- a/tests/studio/install/test_rocm_arch_table_parity.py +++ b/tests/studio/install/test_rocm_arch_table_parity.py @@ -306,13 +306,12 @@ def _match_ps(rows: list[tuple[str, str]], gpu_name: str) -> str | None: ("AMD Radeon RX 6700 XT", "gfx103X-all"), ("AMD Radeon RX 6600 XT", "gfx103X-all"), ("AMD Radeon RX 6500 XT", "gfx103X-all"), - # The RDNA 2 refresh parts, which hold their own number rather than the one already listed. - # All three matched nothing in all seven copies and took CPU torch (#10468). + # RDNA 2 refresh parts: their own number, so all three matched nothing in all seven + # copies and took CPU torch (#10468). ("AMD Radeon RX 6950 XT", "gfx103X-all"), ("AMD Radeon RX 6850M XT", "gfx103X-all"), ("AMD Radeon RX 6550M", "gfx103X-all"), - # The rest of the Navi 24 line, found the same way: enumerating the shipped RDNA 2 - # SKUs against the table shows these two were the only remaining names it missed. + # The rest of Navi 24, from enumerating the shipped RDNA 2 SKUs against the table. ("AMD Radeon RX 6450M", "gfx103X-all"), ("AMD Radeon PRO W6300", "gfx103X-all"), ] From 4554fc675e6466d6eeb6e93d0e05ba8ce037aaca Mon Sep 17 00:00:00 2001 From: danielhanchen Date: Tue, 15 Sep 2026 10:17:14 +0000 Subject: [PATCH 6/6] Tighten the comments this change adds for PR #10746 --- .../backend/tests/test_torch_cpu_build_on_nvidia_host.py | 7 ++----- studio/install_python_stack.py | 5 ++--- tests/studio/install/test_rocm_arch_table_parity.py | 5 ++--- tests/studio/test_amd_name_arch_r9700.ps1 | 2 +- 4 files changed, 7 insertions(+), 12 deletions(-) diff --git a/studio/backend/tests/test_torch_cpu_build_on_nvidia_host.py b/studio/backend/tests/test_torch_cpu_build_on_nvidia_host.py index fe18d47137e..aa1b6c68ade 100644 --- a/studio/backend/tests/test_torch_cpu_build_on_nvidia_host.py +++ b/studio/backend/tests/test_torch_cpu_build_on_nvidia_host.py @@ -1182,11 +1182,8 @@ def test_an_ordinary_intel_igpu_does_not_establish_a_mismatch(monkeypatch, tmp_p def test_an_amd_card_named_only_by_its_marketing_string_establishes_a_mismatch( monkeypatch, tmp_path ): - """A Windows driver that wrote no AdapterFamily leaves the name as the only arch source. - - Dropping a card the installers do ship a wheel for also drops it from Settings > System, - so the panel reads "No visible GPU" beside a card the OS lists (#10468). The name table - decides both, so a gap in it costs the message as well as the wheel. + """With no AdapterFamily from the driver, the name is the only arch source, and a + gap in the name table costs both the wheel and the "No visible GPU" panel (#10468). """ _shared_setup_1(monkeypatch, tmp_path) monkeypatch.setattr(hw, "_linux_kfd_reports_an_amd_gpu", lambda: False) diff --git a/studio/install_python_stack.py b/studio/install_python_stack.py index f1400297469..9e6285ee6b3 100644 --- a/studio/install_python_stack.py +++ b/studio/install_python_stack.py @@ -1922,9 +1922,8 @@ def _dedup_pick( (r"RX 7600|RX 7700S|RX 7650|PRO W7600|PRO W7500", "gfx1102"), # Navi 33 # RDNA 3 iGPU (Phoenix / Hawk Point) (r"780M|760M|740M|Phoenix|Hawk Point|Z1 Extreme|Z2 Extreme", "gfx1103"), - # RDNA 2 refresh parts carry their own number, so 6950 XT / 6850M XT / 6550M matched nothing - # and took CPU torch where the name is the only arch source (#10468). 6850M XT is Navi 22, - # filed here as 6750 / 6700 already are: every RDNA 2 row resolves to gfx103X-all. + # RDNA 2 refresh numbers (6950 / 6850M / 6550M) matched nothing and took CPU torch (#10468). + # 6850M XT is Navi 22, filed here like 6750 / 6700: every RDNA 2 row resolves to gfx103X-all. (r"RX 6950|RX 6900|RX 6850|RX 6800|RX 6750|RX 6700|PRO W6800|PRO W6900", "gfx1030"), # Navi 21 (r"RX 6650|RX 6600|PRO W6600|PRO W6650", "gfx1032"), # Navi 23 ( diff --git a/tests/studio/install/test_rocm_arch_table_parity.py b/tests/studio/install/test_rocm_arch_table_parity.py index 196db25056c..b595add0e5a 100644 --- a/tests/studio/install/test_rocm_arch_table_parity.py +++ b/tests/studio/install/test_rocm_arch_table_parity.py @@ -306,12 +306,11 @@ def _match_ps(rows: list[tuple[str, str]], gpu_name: str) -> str | None: ("AMD Radeon RX 6700 XT", "gfx103X-all"), ("AMD Radeon RX 6600 XT", "gfx103X-all"), ("AMD Radeon RX 6500 XT", "gfx103X-all"), - # RDNA 2 refresh parts: their own number, so all three matched nothing in all seven - # copies and took CPU torch (#10468). + # RDNA 2 refresh numbers: matched nothing in all seven copies, took CPU torch (#10468). ("AMD Radeon RX 6950 XT", "gfx103X-all"), ("AMD Radeon RX 6850M XT", "gfx103X-all"), ("AMD Radeon RX 6550M", "gfx103X-all"), - # The rest of Navi 24, from enumerating the shipped RDNA 2 SKUs against the table. + # The rest of Navi 24, from the shipped RDNA 2 SKU list. ("AMD Radeon RX 6450M", "gfx103X-all"), ("AMD Radeon PRO W6300", "gfx103X-all"), ] diff --git a/tests/studio/test_amd_name_arch_r9700.ps1 b/tests/studio/test_amd_name_arch_r9700.ps1 index 5986bc3cbb3..474db48d1e0 100644 --- a/tests/studio/test_amd_name_arch_r9700.ps1 +++ b/tests/studio/test_amd_name_arch_r9700.ps1 @@ -71,7 +71,7 @@ $otherNames = @( @{ N = "AMD Radeon RX 6900 XT"; A = "gfx1030" }, @{ N = "AMD Radeon RX 6600 XT"; A = "gfx1032" }, @{ N = "AMD Radeon RX 6500 XT"; A = "gfx1034" }, - # RDNA 2 refresh parts: their own number, so the arms above never covered them (#10468). + # RDNA 2 refresh numbers, not covered by the arms above (#10468). @{ N = "AMD Radeon RX 6950 XT"; A = "gfx1030" }, @{ N = "AMD Radeon RX 6850M XT"; A = "gfx1030" }, @{ N = "AMD Radeon RX 6550M"; A = "gfx1034" },