Repository navigation
Conversation
Author
|
@SBrandeis, could you approve the pending Rust, Python, Node, and Wasm workflows for the cross-platform checks? |
ZenAlexa
marked this pull request as ready for review
October 17, 2026 05:44
Collaborator
|
Hi! |
Author
Thank you for your follow-up, whenever you're convenient |
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Fixes #2499.
Keep concurrent pipeline encodes on the same cached Rayon pool. The current
try_lock()path treats a busy cache as a cache miss, constructs another pool, and replaces the shared slot. A burst can therefore create many more workers than the configured pool size, including after warm-up.Serialize construction and cache lookup within a process-owned cache. Keep fork recovery independent of the inherited mutex: the child callback clears the cache pointer, and a PID check also covers a fork during callback registration. Published caches retain process lifetime; the child leaves the inherited lock and pool untouched. Recheck the configuration generation after construction, release retired pools outside the cache lock, and preserve serial fallback on construction failure.
The shared-pool guarantee applies to a fixed configuration and successful construction. In-flight work can retain a pool from an earlier configuration, and calling threads can participate in encoding.
Resource behavior
The issue reproducer uses GPT-2, 8 configured workers, four 114,688-byte texts per caller, and three fresh processes per cell. Every output ID matches serial
encode_into. OS sampling counts distincttk-encode-*worker TIDs; sampled peaks are lower bounds.The added standalone lifecycle scenario checks exact pool identity under 16 concurrent callers, executes real Rayon jobs, and covers child reconstruction, parent reuse, disabling, re-enabling with an outstanding pool reference, and restoring the default. The same scenario fails on the baseline with
concurrent calls constructed distinct shared poolsand passes with this change.Validation
Apple M4 Pro, macOS 26.4, Rust 1.99.0; baseline
ff8ae1baabca0707b7fa9f22854652e231a933de.From
tokenizers/, withCARGO_INCREMENTAL=0 CARGO_PROFILE_RELEASE_LTO=offfor these behavior checks:encode(...).wait()scenarios preserved complete IDs through configuration changes, fork, cancellation, and subsequent reuse.cargo +1.98.1 check --locked --release --target x86_64-pc-windows-msvc -p tk-encode --features parallelism --lib --test parallelism_lifecycleand the feature-disabled library check passed. These are compile-only checks; Windows linking and execution remain unmeasured.Tokbench
Tokbench
20635869used the same GPT-2 tokenizer and English, Chinese, and Arabic corpora for both builds. The currenttk-*dependencies andEncodeOptionsdefaults were applied to the pipeline adapter; driver and core timing loops were unchanged. Both builds used optimization level 3, fat LTO, one codegen unit, and no debug information.Three ABBA blocks produced six measurements per arm; the middle block used
--reverse-scaling. Values below are medians, with 8 configured workers:Concurrent latency, input pins, and measurement scope
A separate public-API consumer ran 8 callers, each with 16 distinct approximately 10 KiB documents. Cold runs included pool construction; steady runs used an independent warm-up batch. Makespan included barrier release, owned-input copying, submission, and completion, with output checking outside the timed region. Every measured batch was compared token-by-token with
tokenizers 0.23.1.The short Arabic single-caller steady case also regressed, from 338.25 to 489.58 碌s. A longer 128-document batch measured 1450.98 and 1466.15 碌s. Separate worker-sampling runs confirmed extra cold workers on the baseline; their elapsed times are excluded from these tables.
Input pins:
openai-community/gpt2@607a30d7andhuggingface/tokbench-corpora@bafa2fb4. The official native-scaling identity check is a separate serial pass; the concurrent consumer checks each actual timed batch.The measurements establish the worker-resource improvement for these workloads; steady latency and throughput remain mixed on this desktop. Public tokenizer and performance checks cover macOS and GPT-2; the pool lifecycle and library suite also ran on Linux aarch64/musl. Windows runtime, glibc, and the full binding/workspace matrices remain outside the local validation.
Current mainline validation
Merged main
fb9429eeintoe99dece2on 2026-10-23. The shared-pool implementation and lifecycle scenario are unchanged. Main's umbrella-crate, feature and binding refactors retain the Python and Node encoding path throughtk-encode/parallelism; Wasm keeps its serial configuration.On macOS arm64 with Rust 1.99.1, the locked Release lifecycle scenario passed, covering concurrent construction, reuse, fork recovery, disabling and re-enabling. The current library suite passed 193 tests with one ignored case; formatting passed.
The Python binding build and the 198-encoding, 16-caller observation reported on 2026-10-19 remain tied to
e5d89e92. They were not rerun after the latest binding dependency changes. The earlier benchmarks also retain their recorded revisions; current binding suites and the platform matrix remain for project CI.Project CI: Please run the repository Rust, Python, Node, and Wasm workflows, including native Windows execution and Linux fork lifecycle coverage. The local lifecycle results and cross-target compilation above are ready for review.