yzhwang commited on
Commit
e05fa1a
Β·
verified Β·
1 Parent(s): a48ecdc

escha 1.2.0: docs + changelog for tensor parallelism

Browse files
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.1.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.1.1+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.
 
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.1.1+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
 
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