使用docker部署easyimage图床
使用docker-compose部署
1234567891011121314151617version: '3.3'
services:
easyimage:
image: docker.1ms.run/ddsderek/easyimage:latest
container_name: easyimage
ports:
- '61021:80'
environment:
- TZ=Asia/Shanghai
- PUID=1000
- PGID=1000
- DEBUG=false
volumes:
- './data/config:/app/web/config'
- './data/i:/app/web/i'
restart: unless-stopped
typora通过picgo-core使用easyimage图床
配置picgo-core
安装和配置picgo-core:
12npm ...
TokenizerManager
流式响应架构详解
总体概览:
sequenceDiagram
participant User as 用户
participant API as FastAPI Server
participant TM as TokenizerManager
participant Router as Router进程
participant Model as Model RPC
participant Detok as Detokenizer
User->>API: POST /generate (GenerateReqInput)
API->>API: obj.post_init()
API->>TM: generate_request(obj)
TM->>TM: 第一次请求创建handle_loop
TM->>TM: tokenizer.encode(text)
TM->>TM: ...
mlp计算流程
先来看一下上图经典mlp的计算:
gate和up的proj,可以cat起来一起算
gate后有一个silu激活,激活后的值和up后的进行点乘,这两个操作也是一起做的
点乘结果给到down_proj就是最后的输出
对于非moe的mlp计算,qwen2和qwen3都一样的用的类Qwen2MLP
核心计算MergedColumnParallelLinear和RowParallelLinear就是使用torch.linear的计算,如果是tp,就是直接进行矩阵分块
12345678910111213141516171819202122232425262728293031323334353637383940414243class Qwen2MLP(nn.Module):
def __init__(
self,
hidden_size: int,
intermediate_size: int,
hidden_act: str,
quant_config: Optional[Qu ...
SGLang源码解析封面
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196 ...
143a5a50a47c0b7d448749907319f4bcc0d8dad15a6dabde8c53c22ae26fc3e82f7aa239b9d442eadeedcf2bb516f7f30e0c9f26619f0c86b5ab908be5cf35b133b72455a9fdac29e0f9010e2a5ba1fd2f431cd9cc06fef021ffb6b3f5a4279e2d13385da883494434e34c068d5041bf605701fbaf2c1c45c590c59a1ff7a3af64bdd36d51eb5eed32f25ac88e50bc1d2fb3c87d0beb44bf51bb2955873c4ef978026cf2992e27c1071aa911998544c30e01334d361ddac802d3deb84738d03cb794f5e49080c102b60504f1995c3be102b0f08c6687507e42d4211bbeb3f630f052aaccc1997fc74ea7b39a67db9de26db60478757833f02 ...
进程结构
tp=1的情况 总共三个进程
启动命令:python3 -m sglang.launch_server --model-path /tmp-data/models/llama-2-7b --port 30000 --mem-fraction-static 0.8 --tp 1
查看进程树:ps -aux —-forest
123luban 3049112 21.6 0.0 7700748 758940 pts/6 Sl+ 11:48 0:09 | \_ python3 -m sglang.launch_server --model-path /tmp-data/models/llama-2-7b --port 30000 --mem-fraction-static 0.8 --tp 1
luban 3052085 32.5 0.0 56482984 769368 pts/6 Sl+ 11:48 0:06 | \_ python3 -m sglang.launch_server --model-path /tm ...
143a5a50a47c0b7d448749907319f4bcc0d8dad15a6dabde8c53c22ae26fc3e82f7aa239b9d442eadeedcf2bb516f7f30e0c9f26619f0c86b5ab908be5cf35b133b72455a9fdac29e0f9010e2a5ba1fd2f431cd9cc06fef021ffb6b3f5a4279e2d13385da883494434e34c068d5041bf478c884b435a86f72fdb24419b179b408e1d02fa3170817d7860c1200770095d7b3c2687e6fcaf8e70b7da5295036f7e5a6f7ed83ddd38f329a4a5d540cb8799091f283a4a8a2517971a829c216ed17828a56eb97c764e41860b4d169b7ff5b71a03fcda093cce8df00da8fbc43325d17b4c4022573db7871f8e75f8a7d7ad34cb510090e67bdc0ae ...
有一个讲的很好:https://zhuanlan.zhihu.com/p/1971883340031328850
qwen3-next结构
模型共计 48 层,被划分为 12 组(每组 4 层)。
前 3 层 采用 Gated DeltaNet Linear
Attention,能够显著提升计算效率并降低显存占用。
第 4 层 为传统的 Full Self Softmax
Attention,在输出阶段额外加入了一道门控。
Gated DeltaNet 分析
关于Gated DeltaNet计算可以看这张图详细一点:
计算顺序:
五个linear矩阵乘
计算一维卷积
计算SiLU激活函数
计算Gated Delta Rule
Gated Delta Rule输入进行Zero-Centered RMSNrom
RMSNorm输出和的结果进行点乘
下面的代码主要来自transformers库,做了部分删减
1. 计算linear矩阵乘
1234567891011121314151617 ...
传统Attention
Soft注意力计算复杂度(以双向注意力也就是忽略mask来着)
先来看注意力计算机制:
双向注意力的计算:
单向注意力的计算:
其中是点乘, 表示mask
为了方便展示,我们先忽略 softmax 符号和 ( 可吸收到矩阵中去):
1、先计算
2、先计算
先计算 时,复杂度为
先计算 时,复杂度为
在长序列场景下, ,所以先计算 的复杂度是要远远低于先计算 的
但是,由于softmax的限制,没办法进行交换运算,导致长序列场景下计算复杂度很高。
那么,能不能不使用softmax计算注意力呢?
对于双向注意力来说,由于没有
矩阵,可以直接交换矩阵相乘的顺序来达到降低复杂度的目的,但是对于单向注意力来说,由于
的存在,不满足矩阵交换相乘,不能直接进行交换。
把写成分量的形式:
其中, 为当前 的分量, 和 为历史 和 的分量 转换成如下形式:
令
则
可见,如上形式可以看成是一个以 为State的线性RNN。
是历史 和
的外积之和,存储了所有的历史信息,我们只需要维护一个固定大小的状态矩阵
而无需燰 ...
sgl-router的smart router策略
为什么要有sgl-router
flowchart LR
subgraph Client["💻 Clients"]
C1["Client 3"]
C2["Client 1"]
C3["Client 2"]
end
C1 --> RT
C2 --> RT
C3 --> RT
subgraph Router["sglang-router"]
RT["🔀 Router"]
end
subgraph PCluster["Prefill Workers (P-nodes)"]
P1["P1"]
P2["P2"]
P3["P3"]
end
subgraph DCluster["Decode Workers (D-nodes)"]
D1["D1"]
D2["D2"]
D3 ...







