2026/2/20 19:41:23
网站建设
项目流程
asp企业网站模版,网页开发工具所见即所得,软件外包是什么意思?,网站建设销售顾问开场白BPE 训练完成后#xff0c;下一步就是把分词器“固化”下来#xff0c;并让它真正能被后续环节#xff08;数据管道、模型训练、推理#xff09;无缝调用。核心只有三件事#xff1a;保存、验证、接入。下面给出一份可直接落地的 checklist#xff0c;既适用于本地实验下一步就是把分词器“固化”下来并让它真正能被后续环节数据管道、模型训练、推理无缝调用。核心只有三件事保存、验证、接入。下面给出一份可直接落地的 checklist既适用于本地实验也适用于百度千帆/DeepSeek 这类平台化训练。保存一份“全量”文件胜过零散碎片• 推荐用 Hugging Face Tokenizers 的 tokenizer.save(“output_dir/tokenizer.json”) 一次性导出里面已包含– vocabmerges– 预/后处理规则normalizer、pretokenizer、decoder– special_tokens 映射• 这样后续用 PreTrainedTokenizerFast.from_file(“tokenizer.json”) 即可 100 % 复现分词行为避免线上线下不一致 。验证让“新语料”跑一遍• 随机抽 1 k–10 k 条业务侧真实文本调用 tokenizer.encode_batch()检查– 词表覆盖率OOV 比例– 平均 token 长度影响推理速度– special_tokens 是否被正确识别尤其是 、、• 如果 OOV 偏高说明训练语料与业务领域差距大需要回炉追加数据或调大 vocab_size。接入与训练/推理框架对齐3.1 本地 PyTorch 实验• 把 tokenizer.json 放进项目目录数据管道里用 Dataset DataLoader 把原始文本 → input_ids• 训练脚本启动前保证 vocab_size 与模型 embedding 层维度一致即可 。3.2 百度千帆或任何云厂商• 在“自定义 tokenizer” 页面上传 tokenizer.json平台会自动解析为内部格式• 训练配置里把 vocab_path 指向上传后的文件 ID同时 model_config.vocab_size 与之保持一致• 若平台只支持旧版“vocab.txt merges.txt”双文件可先用 tokenizer.save_model(dir) 导出再分别上传 。3.3 DeepSeek 系列模型继续预训练• DeepSeek 官方仓库已给出示范训练完 BPE 后设置 tokenizer.decoder decoders.ByteLevel() 保证解码可逆然后直接走 llm.training 流程即可 。一句话总结BPE 训练完 ≠ 结束把 tokenizer.json 当成“模型的一部分”一起版本管理并在真实数据上快速 smoke test再无缝挂到训练/推理流程里就能避免 90 % 的线上线下不一致问题。“只看 ZINC20 语料”的实战脚本10 分钟就能从 3 份 BPE 词表里挑出真正最适合化学 SMILES 的那一份并直接算出上传千帆前必须填的「vocab_size」字段。整套流程已按下面 3 步拆好全部命令可复制即用。准备 1 万条「纯 ZINC20 SMILES」验证集ZINC20 官方 Parquet dump 里拿 2D-smiles 列即可采样 1 万条就能让指标稳定再多收益极小。# 安装依赖pipinstallpandas pyarrow rdkit transformers# 采样脚本python -PY import pandas as pd, os, random, json from rdkit import Chem df pd.read_parquet(zinc20_2d.parquet, columns[smiles]) df df.sample(n10000, random_state42) # 简单清洗去重 能解析 df df.drop_duplicates() df df[df.smiles.apply(lambda s: Chem.MolFromSmiles(s) is not None)] df.smiles.to_csv(zinc20_10k.txt, indexFalse, headerFalse) print(valid SMILES:, len(df)) PY对 3 份词表跑「化学专用」3 指标指标解释压缩率 总 token 数 ÷ 总字符数越低越好平均 SMILES 长度越短越省算力无效 token 率解析不回合法分子的比例必须 0.5%fortinbpe1.json bpe2.json bpe3.json;doecho$tpython -PY import json, subprocess, sys, statistics as st from rdkit import Chem from transformers import AutoTokenizer tok AutoTokenizer.from_pretrained(gpt2) # 占位下面覆盖 with open(sys.argv[1]) as f: tkjson.load(f) tok.tokenizer_fileNone; tok.backend_tokenizerNone tok._tokenizer tok.backend_tokenizer_from_json(json.dumps(tk)) tokens[]; chars0; bad0 for line in open(zinc20_10k.txt): smiline.strip() chars len(smi) ids tok.encode(smi, add_special_tokensFalse) tokens.append(len(ids)) if Chem.MolFromSmiles(smi) is None: bad1 print(压缩率 %.3f 平均长度 %.1f 无效 %.2f%%% (sum(tokens)/chars, st.mean(tokens), bad/100)) PY$tdone输出示例仅示范 bpe1.json 压缩率 0.42 平均长度 42.3 无效 0.12% bpe2.json 压缩率 0.39 平均长度 38.7 无效 0.15% bpe3.json 压缩率 0.41 平均长度 40.1 无效 0.11%直接选「压缩率最低 平均长度最短」那份即可上例即 bpe2。把胜出词表转成「千帆 tokenizer 资源包」千帆要求 4 个字段一个不能少且 merges 必须是「空格分隔」文本数组。mkdirqianfan_tk python -PY import json tkjson.load(open(bpe2.json)) out{ type:BPE, vocab: tk[model][vocab], merges: [ .join(pair) for pair in tk[model][merges]], special_tokens: {k:v for k,v in tk.get(added_tokens,{}).items()} } json.dump(out, open(qianfan_tk/tokenizer.json,w), indent2) print(vocab_size , len(out[vocab])) PYzip-r zinc20_bpe_best.zip qianfan_tk控制台会打印出「vocab_size 31992」这类数字记下来下一步填到千帆网页表单里即可。一句话总结用上面 3 步你就能在 10 分钟内拿到纯 ZINC20 验证集量化对比 3 份词表在化学 SMILES 上的真实表现自动生成可直接上传百度千帆的 tokenizer.zip 并知道确切的 vocab_size后续创建 DeepSeek 训练任务时直接选用即可。祝训练顺利python - PY … PY这种写法叫here-document内联文档它把一段多行 Python 代码直接塞给解释器而不额外创建 .py 文件。在“快速验证 / 一次性脚本”场景里特别方便原因有三零文件残留整条命令写在 shell 里执行完磁盘上不会留下临时脚本适合拷贝即用、用完即走。变量穿透如果 here-doc 里用PY不加引号还能直接读取 shell 变量前面示例用了PY引号包住定界符Python 代码里出现$也不会被 shell 提前展开避免误替换。管道/重定向友好可以把前面的输出直接管道进来或者把 Python 结果继续管道给后续命令一条命令链完成整个小任务。对比其他写法写法缺点先cat tmp.py再python tmp.py多一个文件事后要删直接python -c …多行代码需要手动加\n和转义可读性差交互式python再粘贴不能自动化CI/远程会话里容易断因此在“给一段 10~50 行的临时 Python 逻辑”时python - PY是最简洁、最可维护、最可复制的做法。