代码在文末,参考自:https://github.com/cloudwu/coroutine
用 300
行 C 代码实现一个协程库:共享栈与 ucontext 的艺术
你写过这样的代码吗?一个网络服务器,每连接一个客户端就创建一个线程。当并发达到几千时,内存占用飙升,系统调用开销让你抓狂。你听说过协程——那些”轻量级线程”——但
C 语言没有原生的协程支持。
这篇文章会带你从零理解协程的原理,并通过一个真实的实现(约 300 行 C
代码)展示如何在 C
中实现高效的协程,包括一个关键技巧:共享栈,让你可以创建上千个协程而不耗尽内存。
协程是什么?为什么不是”用户态线程”那么简单
协程(Coroutine)常被描述为”用户态线程”或”轻量级线程”。这个比喻对了一半——协程确实在用户态切换,不需要内核参与。但另一半经常被忽略:协程的切换时机由程序员完全控制,而不是由调度器抢占。
这带来了几个关键区别:
特性
进程
线程
协程
切换发起者
内核调度器
内核调度器
程序员代码
切换时机
不可预测
不可预测
完全确定
是否需要锁
需要
需要
通常不需要 ...
Mini-SGLang Overlap
Scheduler 原理详解
在 LLM 推理系统中,CPU 侧的调度开销(接收请求、准备
batch、处理结果)往往会拖慢 GPU 的计算效率。Mini-SGLang 通过
Overlap Scheduling 将 CPU 处理和 GPU 计算重叠执行,把
CPU 瓶颈藏进 GPU 计算的空闲时间里。
核心问题
传统调度器的执行模式是这样的:
sequenceDiagram
participant CPU
participant GPU
CPU->>CPU: 接收请求、准备batch
CPU->>GPU: 发送任务
GPU->>GPU: 执行推理 (100ms)
GPU-->>CPU: CPU同步等待返回结果
CPU->>CPU: 处理结果
问题在于:GPU 推理时 CPU 在等待,CPU 处理结果时 GPU
在等待。双方无法充分利用。
Overlap Scheduler 的解法
Mini-SGLang 使用双 ...
以nano-sglang举例子
下面以llama2-7b来说,apply*chat_template是在开头加上<s>*
输入”12345” 就是 <s>_12345,对应input_ids是[1,
29871, 29896, 29906, 29941, 29946, 29945]
prefill
我们第一遍先发送”12345”,那么[1, 29871, 29896, 29906, 29941, 29946,
29945]就会被cache住
第二遍发送”1234512345”,就是cache了7个token,要extend5个
req.input_ids = [1, 29871, 29896, 29906, 29941, 29946, 29945, 29896,
29906, 29941, 29946, 29945]
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 ...
投机采样参数配置
启动sglang时添加以下参数:
1234567891011# deepseek
--speculative-algorithm EAGLE
--speculative-num-steps 1
--speculative-eagle-topk 1
--speculative-num-draft-tokens 2
# qwen3-next
--speculative-algorithm NEXTN
--speculative-num-steps 3
--speculative-eagle-topk 1
--speculative-num-draft-tokens 4
注意有一些参数校验:
NEXTN和EAGLE是相同的算法
当前版本投机采样不支持scheduler的overlap
speculative_num_draft_tokens是要和speculative_eagle_topk/speculative_num_steps关联的,不能乱填
123456789101112131415161718192021222324252627282930 ...
统一时间耗时:
对于这样的形式:
12341.2 ms
2.345 ns
3921 us
0.312 s
使用:
1=LET( t, TRIM(C2), v, VALUE(LEFT(t, FIND(" ", t & " ")-1)), u, MID(t, FIND(" ", t & " ")+1, 10), SWITCH(TRUE, u="ns", v, u="μs", v*1000, u="ms", v*1000000, u="s", v*1000000000, TRUE, v ) )
注意新弄一个单元格,然后把上面的C2重新写成要选择的,就可以解析时间单位,最后统一成ns单位了
最后再扩展和求和就可以了
1.安装依赖包
需要cmake>3.26,和一些package
sudo apt install -y libnuma-dev libssl-dev
12345678wget https://github.com/Kitware/CMake/releases/download/v4.2.2/cmake-4.2.2.tar.gz .
e cmake-*.tar.gz
e cmake-4.2.2.tar.gz
cd cmake-4.2.2
cmake -S . -B build && cmake --build build
cmake --install build
sudo apt install cmake # 卸载系统的cmake
cmake --version
2.编译源码并安装
12cd sgl-kernel
make build
保存每一层 Hidden States
进行精度对比
目标
对比两套不同启动方法的每一层 hidden states
输出,找出精度差异的根源。
方案概述
使用 SGLang 现有的 tensor_dump_forward_hook
机制自动保存所有中间张量,然后使用 dump_comparator
工具进行对比。
关键文件
python/sglang/srt/debug_utils/tensor_dump_forward_hook.py
- 自动保存机制
python/sglang/srt/debug_utils/dump_comparator.py -
对比工具
python/sglang/srt/server_args.py - 命令行参数定义
实现步骤
第一步:准备测试脚本
创建测试脚本 test_hidden_states.py:
123456789101112131415161718import requests
import json
url = "http://localhost:8000/v1/chat/completions"
headers ...
unicode编码
在python可以使用ord函数查询某个字符的unicode编码,可以chr函数反查
特殊的,chr(0) 就是空字符(NUL)
print打印这个字符是看不到的
repr可以更精细,看到的是’’
123456ord('牛') #29275
chr(29275) #'牛'
chr(0) #'\x00'
print(chr(0)) #
"this is a test" + chr(0) + "string" #'this is a test\x00string'
print("this is a test" + chr(0) + "string")#this is a teststring
NOTE
Q:为什么用UTF-8编码进行tokenizer而不是UTF-16/UTF-32
UTF-32:每个Unicode字符固定4 字节,不管是 a、中、🙂,全部 4
字节,例如 'a' -> 00 00 00 61
'中' -> 00 ...
取出指定字段
例如对于
1234{
"abc": "123",
"def": [{ "111": "..." }, { "222": "..." }]
}
可以通过 jq '.def[0]' test.json 取出数组第一个元素:
1# 输出: {"111":"..."}
常用取值方式:
1234567891011# 取出单个字段
jq '.abc' test.json # "123"
# 取出嵌套字段
jq '.def[0]."111"' test.json # "..."
# 取出数组所有元素
jq '.def[]' test.json
# -c 参数压缩输出(单行)
jq -c '.def[0]' test.json > output.json
把当前内容放到一个结构体里构成一个新的json
假如我们已经有了一个:
1234[
{ "role": "system", "content": "有用的助手" },
{ "role": "user", "content": "用户: halo" }
]
希望把上面的内容包装 ...
Qwen3-Next
Piecewise CUDA Graph 支持实现技术文档
文档信息
项目
说明
目标
详细分析 commit
d64bf6c 如何为 Qwen3-Next 模型添加 Piecewise CUDA Graph 支持
Commit
d64bf6c6ce703389cbeaaa44fe5ee3c699397d0d
PR
#13081
日期
2025-11-25
1. 概述
1.1 Commit 目标
为 Qwen3-Next 模型添加 Piecewise CUDA Graph 支持,使其能够在使用
Piecewise CUDA Graph 时获得性能提升。
1.2 修改文件清单
文件
修改内容
行数变化
python/sglang/srt/compilation/backend.py
添加 gdn_with_output 到 SPLIT_OPS
+1
python/sglang/srt/layers/attention/fla/chunk_o.py
修复 uninitialized ...









