escha 1.2.0: docs + changelog for tensor parallelism
Browse files- README.md +21 -5
- THIRD_PARTY_LICENSES/THIRD_PARTY_NOTICES.md +2 -2
- sglang/INSTALL.md +1 -1
README.md
CHANGED
|
@@ -121,6 +121,27 @@ an answer is always produced: see
|
|
| 121 |
|
| 122 |
## Changelog
|
| 123 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 124 |
**1.1.1** (2026-08-21) β `process_weights_after_loading` now takes the rank's device
|
| 125 |
instead of a hardcoded `cuda:0`. The hardcode put every 2-bit buffer on `cuda:0` while
|
| 126 |
the input tensor sat on the server's actual device, so **any run not on device 0 β
|
|
@@ -130,11 +151,6 @@ traceback that pointed at the kernel rather than at the cause. Bit-identical whe
|
|
| 130 |
`cuda:0` was already correct, which is every configuration `serve.sh` ships. Reported
|
| 131 |
with a diagnosis and a fix by [@ginerJuanUdesa](https://github.com/ginerJuanUdesa/escha-tp-fix-qwen3dense).
|
| 132 |
|
| 133 |
-
> Note: this fixes the device placement only. **`--tp-size > 1` is still not supported** β
|
| 134 |
-
> the weight loader does not shard escha tensors per rank, so every rank holds the full
|
| 135 |
-
> checkpoint. A community patch for that exists at the link above and is under review; it
|
| 136 |
-
> is not in this wheel yet.
|
| 137 |
-
|
| 138 |
**1.1.0** (2026-08-20) β first wheel with the dense (`escha`) serving path; the 1.0.x
|
| 139 |
wheels registered `eschamoe` only, so a dense checkpoint failed at registry lookup.
|
| 140 |
|
|
|
|
| 121 |
|
| 122 |
## Changelog
|
| 123 |
|
| 124 |
+
**1.2.0** (2026-08-21) β **tensor parallelism (`--tp-size N`) now works.** The escha
|
| 125 |
+
parameter class pins its own weight loader, which meant sglang's TP slicing never ran and
|
| 126 |
+
every rank kept the whole checkpoint (rank 0 died with `weight must have shape
|
| 127 |
+
(dim, width)`). It now slices per rank, including the fused-on-disk GDN `in_proj_qkv`,
|
| 128 |
+
which is split into its three sub-projections first.
|
| 129 |
+
|
| 130 |
+
> **Single-GPU users are unaffected.** Every new code path is gated on
|
| 131 |
+
> `world_size > 1`; at `--tp-size 1` the loader is byte-for-byte what 1.1.1 did. Verified
|
| 132 |
+
> as an identical shard layout and byte-identical greedy output.
|
| 133 |
+
>
|
| 134 |
+
> **TP > 1 is new and lightly tested β treat it as experimental.** It was contributed and
|
| 135 |
+
> validated by [@ginerJuanUdesa](https://github.com/ginerJuanUdesa/escha-tp-fix-qwen3dense)
|
| 136 |
+
> on 2Γ RTX 3090 (symmetric 6.02 GB/rank, coherent greedy output). **We have one GPU and
|
| 137 |
+
> could not reproduce it**, and no numerical equivalence check against `--tp-size 1` has
|
| 138 |
+
> been run yet. If you use it for evaluation, sanity-check a benchmark against the
|
| 139 |
+
> single-GPU numbers first. Note that a multi-rank all-reduce reorders float accumulation,
|
| 140 |
+
> so TP > 1 output is not expected to match TP = 1 bit-for-bit even when correct.
|
| 141 |
+
>
|
| 142 |
+
> On Ampere/Ada/Hopper you can add `DETERMINISTIC=1` to remove that reduction-order
|
| 143 |
+
> variance if you want a stricter comparison.
|
| 144 |
+
|
| 145 |
**1.1.1** (2026-08-21) β `process_weights_after_loading` now takes the rank's device
|
| 146 |
instead of a hardcoded `cuda:0`. The hardcode put every 2-bit buffer on `cuda:0` while
|
| 147 |
the input tensor sat on the server's actual device, so **any run not on device 0 β
|
|
|
|
| 151 |
`cuda:0` was already correct, which is every configuration `serve.sh` ships. Reported
|
| 152 |
with a diagnosis and a fix by [@ginerJuanUdesa](https://github.com/ginerJuanUdesa/escha-tp-fix-qwen3dense).
|
| 153 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 154 |
**1.1.0** (2026-08-20) β first wheel with the dense (`escha`) serving path; the 1.0.x
|
| 155 |
wheels registered `eschamoe` only, so a dense checkpoint failed at registry lookup.
|
| 156 |
|
THIRD_PARTY_LICENSES/THIRD_PARTY_NOTICES.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
| 1 |
-
# Third-Party Notices β Escha Runtime (`escha` 1.
|
| 2 |
|
| 3 |
This repository distributes the **runtime** only (the `escha` wheel: quantization/serving
|
| 4 |
kernels + a modified SGLang fork). SGLang is the only engine in this repository. The quantized **model weights** are distributed
|
|
@@ -9,7 +9,7 @@ All bundled third-party code is under **permissive licenses (Apache-2.0, MIT, BS
|
|
| 9 |
an audit found **no copyleft (GPL / LGPL / AGPL / MPL / SSPL) code**. The obligations below are
|
| 10 |
satisfied by the files in this `THIRD_PARTY_LICENSES/` directory together with the copyright
|
| 11 |
notices retained verbatim in the redistributed source (inside the wheel). The same texts are also
|
| 12 |
-
embedded in the wheel metadata (`escha-1.
|
| 13 |
|
| 14 |
The `escha` runtime itself is released under the Apache License, Version 2.0 β see the top-level
|
| 15 |
`LICENSE` file of this repository.
|
|
|
|
| 1 |
+
# Third-Party Notices β Escha Runtime (`escha` 1.2.0)
|
| 2 |
|
| 3 |
This repository distributes the **runtime** only (the `escha` wheel: quantization/serving
|
| 4 |
kernels + a modified SGLang fork). SGLang is the only engine in this repository. The quantized **model weights** are distributed
|
|
|
|
| 9 |
an audit found **no copyleft (GPL / LGPL / AGPL / MPL / SSPL) code**. The obligations below are
|
| 10 |
satisfied by the files in this `THIRD_PARTY_LICENSES/` directory together with the copyright
|
| 11 |
notices retained verbatim in the redistributed source (inside the wheel). The same texts are also
|
| 12 |
+
embedded in the wheel metadata (`escha-1.2.0+qwen3dense.dist-info/licenses/LICENSE`).
|
| 13 |
|
| 14 |
The `escha` runtime itself is released under the Apache License, Version 2.0 β see the top-level
|
| 15 |
`LICENSE` file of this repository.
|
sglang/INSTALL.md
CHANGED
|
@@ -287,7 +287,7 @@ inject into the system prompt β at some cost in reasoning-dependent accuracy.
|
|
| 287 |
- **`ValueError: Invalid quantization method ...`.** The wheel's registry ships exactly two
|
| 288 |
methods, `escha` (dense) and `eschamoe` (mixture-of-experts). Check your model's
|
| 289 |
`quantize_config.json` / `config.json` names one of them, and that you installed *this* wheel
|
| 290 |
-
(`python -c "import escha; print(escha.__version__)"` should print `1.
|
| 291 |
1.0.x wheels registered `eschamoe` only and cannot load a dense model at all.
|
| 292 |
|
| 293 |
- **`ModuleNotFoundError: pybase64` / `msgspec` / `xgrammar` / `flashinfer` at startup.** The wheel
|
|
|
|
| 287 |
- **`ValueError: Invalid quantization method ...`.** The wheel's registry ships exactly two
|
| 288 |
methods, `escha` (dense) and `eschamoe` (mixture-of-experts). Check your model's
|
| 289 |
`quantize_config.json` / `config.json` names one of them, and that you installed *this* wheel
|
| 290 |
+
(`python -c "import escha; print(escha.__version__)"` should print `1.2.0+qwen3dense`) β the
|
| 291 |
1.0.x wheels registered `eschamoe` only and cannot load a dense model at all.
|
| 292 |
|
| 293 |
- **`ModuleNotFoundError: pybase64` / `msgspec` / `xgrammar` / `flashinfer` at startup.** The wheel
|