CUDA engine selector: sm_MN machine code also covers a card sm_MK of the same major version with K >= N (CUDA cubin compatibility), so an RTX 40 card (sm_89) takes an sm_86 package; tests for the Qwen and DeepSeek packages; DeepSeek card text says RTX 30, 40 and 50

This commit is contained in:
Niko1221 committed 2026-10-24 13:40:27 +02:00
1 parent 7dd5cf18e6
commit b750d757f6
11 files changed
+62 -13

No files matched your search

+1 -1
View File
@@ -174,7 +174,7 @@ Auch mit weniger RAM, als eine Zeile nennt, kann es funktionieren, nur langsamer
Ein deutlich größeres Modell, das auf einer Grafikkarte mit 12 GB und 46 bis 64 GB RAM läuft. Strata hält die meistgenutzten
Teile im Speicher und liest den Rest von deiner SSD. [ISTA-DASLab](https://huggingface.co/ISTA-DASLab/DeepSeek-V4.1-Flash-1017-GSQ-RCO-GGUF)
hat die Sets gebaut. Es läuft auf NVIDIA-RTX-Karten der Serien 30 bis 50 und auf der Radeon AI PRO R9700. Wähle es in
hat die Sets gebaut. Es läuft auf NVIDIA-RTX-Karten der Serien 30, 40 und 50 und auf der Radeon AI PRO R9700. Wähle es in
`strata launch`. Die Desktop-App bietet es noch nicht an.
| Set | Download | Qualität | Schreibt Code mit |
+1 -1
View File
@@ -174,7 +174,7 @@ Con menos RAM de la que indica una fila también puede funcionar, solo que más
Un modelo mucho más grande que funciona con una sola tarjeta gráfica de 12 GB y de 46 a 64 GB de RAM. Strata mantiene en
memoria las partes más usadas y lee el resto de tu SSD. [ISTA-DASLab](https://huggingface.co/ISTA-DASLab/DeepSeek-V4.1-Flash-1017-GSQ-RCO-GGUF)
hizo los conjuntos. Funciona en tarjetas NVIDIA RTX de las series 30 a 50 y en la Radeon AI PRO R9700. Elígelo en
hizo los conjuntos. Funciona en tarjetas NVIDIA RTX de las series 30, 40 y 50 y en la Radeon AI PRO R9700. Elígelo en
`strata launch`. La aplicación de escritorio todavía no lo ofrece.
| Conjunto | Descarga | Calidad | Escribe código a |
+1 -1
View File
@@ -174,7 +174,7 @@ Avoir moins de RAM que ce qu'indique une ligne peut encore fonctionner, en plus
Un modèle bien plus gros, qui tourne sur une seule carte graphique de 12 Go avec 46 à 64 Go de RAM. Strata garde en mémoire
les parties les plus utilisées et lit le reste sur votre SSD. [ISTA-DASLab](https://huggingface.co/ISTA-DASLab/DeepSeek-V4.1-Flash-1017-GSQ-RCO-GGUF)
a produit les versions. Il fonctionne sur les cartes NVIDIA RTX des séries 30 à 50 et sur la Radeon AI PRO R9700. Choisissez-le
a produit les versions. Il fonctionne sur les cartes NVIDIA RTX des séries 30, 40 et 50 et sur la Radeon AI PRO R9700. Choisissez-le
dans `strata launch`. L'application de bureau ne le propose pas encore.
| Version | Téléchargement | Qualité | Écrit du code à |
+1 -1
View File
@@ -169,7 +169,7 @@ NVIDIA、AMD、Intel Arc、Apple Silicon で動きます。
ずっと大きなモデルで、12 GB のグラフィックスカード 1 枚と 46 から 64 GB の RAM で動きます。Strata はよく使う部分をメモリに置き、
残りは SSD から読みます。セットは [ISTA-DASLab](https://huggingface.co/ISTA-DASLab/DeepSeek-V4.1-Flash-1017-GSQ-RCO-GGUF) が作りました。
NVIDIA RTX 30 から 50 シリーズのカードと Radeon AI PRO R9700 で動きます。`strata launch` で選んでください。デスクトップアプリはまだ対応していません。
NVIDIA RTX 30、40、50 シリーズのカードと Radeon AI PRO R9700 で動きます。`strata launch` で選んでください。デスクトップアプリはまだ対応していません。
| セット | ダウンロード | 品質 | コードの出力速度 |
| --- | ---: | --- | --- |
+1 -1
View File
@@ -169,7 +169,7 @@ Less RAM than a row says can still work, only slower: Strata switches to its
A much bigger model that runs on one 12 GB graphics card with 46 to 64 GB of RAM. Strata keeps the busiest parts in memory and
reads the rest from your SSD. [ISTA-DASLab](https://huggingface.co/ISTA-DASLab/DeepSeek-V4.1-Flash-1017-GSQ-RCO-GGUF)
made the sets. It runs on NVIDIA RTX 30 to 50 cards and the Radeon AI PRO R9700. Pick it in `strata launch`; the desktop
made the sets. It runs on NVIDIA RTX 30, 40 and 50 cards and the Radeon AI PRO R9700. Pick it in `strata launch`; the desktop
app does not offer it yet.
| Set | Download | Quality | Writes code at |
+1 -1
View File
@@ -172,7 +172,7 @@ Com menos RAM do que a linha indica, ainda pode funcionar, só que mais devagar:
Um modelo bem maior, que roda numa única placa de vídeo de 12 GB com 46 a 64 GB de RAM. O Strata mantém na memória as partes mais
usadas e lê o resto do seu SSD. A [ISTA-DASLab](https://huggingface.co/ISTA-DASLab/DeepSeek-V4.1-Flash-1017-GSQ-RCO-GGUF)
fez os conjuntos. Ele roda em placas NVIDIA RTX das séries 30 a 50 e na Radeon AI PRO R9700. Escolha no `strata launch`. O
fez os conjuntos. Ele roda em placas NVIDIA RTX das séries 30, 40 e 50 e na Radeon AI PRO R9700. Escolha no `strata launch`. O
app de desktop ainda não o oferece.
| Conjunto | Download | Qualidade | Escreve código a |
+1 -1
View File
@@ -166,7 +166,7 @@ Set up Strata on this PC for me: https://github.com/Niko1221/Strata - follow doc
一个大得多的模型,用一块 12 GB 显卡加 46 到 64 GB 内存就能运行。Strata 把最常用的部分留在内存里,其余的从你的固态硬盘读取。
这些版本由 [ISTA-DASLab](https://huggingface.co/ISTA-DASLab/DeepSeek-V4.1-Flash-1017-GSQ-RCO-GGUF) 制作。它可在
NVIDIA RTX 30 到 50 系列显卡和 Radeon AI PRO R9700 上运行。请在 `strata launch` 里选择它。桌面应用暂时不提供。
NVIDIA RTX 30、40、50 系列显卡和 Radeon AI PRO R9700 上运行。请在 `strata launch` 里选择它。桌面应用暂时不提供。
| 版本 | 下载大小 | 质量 | 写代码速度 |
| --- | ---: | --- | --- |
+1 -1
View File
@@ -8054,7 +8054,7 @@ def install_dsv41(a, family, gpu, hip, amd, cuda_tk, multi, port, ram, adopted,
if os.environ.get("STRATA_VERBOSE") == "1" or "--verbose" in sys.argv:
say(" Details for developers: build it with cmake -DSTRATA_BUILD_DSV41=ON and point STRATA_DSV41_EXE at it.")
fail("DeepSeek's engine is not available for this computer yet",
"Supported graphics cards: NVIDIA RTX 30 and RTX 50 series, and the Radeon AI PRO R9700. " + dsv41_manual_steps(eng)
"Supported graphics cards: NVIDIA RTX 30, 40 and 50 series, and the Radeon AI PRO R9700. " + dsv41_manual_steps(eng)
+ " Or update Strata later (a newer version may add your card), or pick another model. Nothing has been downloaded.")
ok(f"engine: {exe}")
+13 -4
View File
@@ -758,19 +758,28 @@ def nvidia_driver_version() -> str | None:
return min(versions, key=_version_key) if versions else None
def _capability(number: str) -> tuple[int, int]:
"""``86`` -> (8, 6), ``120`` -> (12, 0): the last digit is the minor version."""
return int(number[:-1] or 0), int(number[-1])
def arch_covers(archs, present: list[str]) -> bool:
"""Whether a build with `archs` (``sm_86`` = machine code for that card, ``compute_89`` = PTX that any card of
that generation or newer can JIT) can run on at least one of the `present` cards (``sm_XX``)."""
cards = {int(item[3:]) for item in present if item.startswith("sm_") and item[3:].isdigit()}
that generation or newer can JIT) can run on at least one of the `present` cards (``sm_XX``).
Machine code also runs on a card of the same major version with an equal or newer minor version (CUDA's cubin
compatibility rule): ``sm_86`` code runs on an ``sm_89`` card (RTX 40) but not on ``sm_80`` (older minor),
``sm_90`` (other major) or ``sm_75``; ``sm_120`` code runs on ``sm_121``."""
cards = {item[3:] for item in present if item.startswith("sm_") and item[3:].isdigit()}
if not cards:
return True # cannot tell: not a refusal
for arch in archs:
kind, _, number = arch.partition("_")
if not number.isdigit():
continue
if kind == "sm" and int(number) in cards:
if kind == "sm" and any(number == card or (len(number) > 1 and len(card) > 1 and _capability(card)[0] == _capability(number)[0]
and _capability(card)[1] >= _capability(number)[1]) for card in cards):
return True
if kind == "compute" and any(card >= int(number) for card in cards):
if kind == "compute" and any(int(card) >= int(number) for card in cards):
return True
return False
+40
View File
@@ -204,6 +204,46 @@ class Arch(unittest.TestCase):
self.assertFalse(ec.arch_covers(["sm_75", "compute_89"], ["sm_86"]), "PTX never runs on an older card")
self.assertTrue(ec.arch_covers(["sm_86"], []), "cannot tell: not a refusal")
def test_machine_code_runs_on_a_newer_minor_of_the_same_major(self):
"""CUDA's cubin rule: sm_MN code runs on sm_MK when K >= N (an RTX 40 card, sm_89, runs sm_86 code)."""
self.assertTrue(ec.arch_covers(["sm_86"], ["sm_89"]))
self.assertTrue(ec.arch_covers(["sm_120"], ["sm_121"]))
self.assertTrue(ec.arch_covers(["sm_86"], ["sm_86"]))
self.assertTrue(ec.arch_covers(["sm_80"], ["sm_86"]))
self.assertFalse(ec.arch_covers(["sm_86"], ["sm_80"]), "an older minor version is not covered")
self.assertFalse(ec.arch_covers(["sm_86"], ["sm_90"]), "another major version is not covered")
self.assertFalse(ec.arch_covers(["sm_86"], ["sm_75"]), "an older major version is not covered")
self.assertFalse(ec.arch_covers(["sm_86"], ["sm_120"]), "Blackwell is another major version")
self.assertFalse(ec.arch_covers(["sm_120"], ["sm_89"]))
self.assertFalse(ec.arch_covers(["sm_89"], ["sm_100"]), "sm_100 is major 10, not major 1 + minor 00")
self.assertTrue(ec.arch_covers(["sm_86", "sm_120"], ["sm_75", "sm_89"]), "one covered card is enough")
def test_the_packages_of_each_engine(self):
"""The Qwen engine (sm_86 + PTX 89) and the DeepSeek engine (sm_86 + sm_120 + PTX 120) on the RTX 20 to 50 families."""
from strata_control import feed
def package(archs):
return feed.EnginePackage(version="0.1.49.1", platform="linux-x86_64", backend="cuda", variant="cuda13", archs=tuple(archs),
min_driver={}, min_runtime=None, build_id="b", url="u", format="tar.gz", size=1, sha256="a" * 64,
manifest_sha256="b" * 64, installed_bytes=1)
def fits(pkg, card):
hw = {"platform": "linux-x86_64", "backend": "cuda", "cuda_archs": [card], "nvidia_driver": None}
return not feed.engine_fit_reasons(pkg, hw)
qwen = package(["sm_86", "compute_89"])
deepseek = package(["sm_86", "sm_120", "compute_120"])
deepseek_89 = package(["sm_86", "sm_89", "sm_120", "compute_120"])
for card, qwen_ok, deepseek_ok in (("sm_75", False, False), ("sm_86", True, True), ("sm_89", True, True), ("sm_90", True, False),
("sm_120", True, True), ("sm_121", True, True)):
with self.subTest(card=card):
self.assertEqual(fits(qwen, card), qwen_ok, f"Qwen engine on {card}")
self.assertEqual(fits(deepseek, card), deepseek_ok, f"DeepSeek engine on {card}")
for card in ("sm_86", "sm_89", "sm_120", "sm_121"):
self.assertTrue(fits(deepseek_89, card), card)
self.assertFalse(fits(deepseek_89, "sm_90"), "H100 (sm_90) needs its own code or PTX 90")
self.assertFalse(fits(deepseek_89, "sm_75"))
class Start(unittest.TestCase):
"""What a start checks: every file's hash (not only the entrypoint), the driver, the signature policy."""
+1 -1
View File
@@ -229,7 +229,7 @@ class Install(unittest.TestCase):
rc, out = self.install(engine=False)
self.assertEqual(rc, 1, out)
self.assertIn("DeepSeek's engine is not available for this computer yet", out)
self.assertIn("RTX 30", out)
self.assertIn("RTX 30, 40 and 50", out)
self.assertNotIn("cmake", out)
self.assertNotIn("STRATA_DSV41_EXE", out)
self.assertIn("Nothing has been downloaded", out)