做网站需要哪些东西和步骤/百度账号注册入口

做网站需要哪些东西和步骤,百度账号注册入口,成都哪家公司做网站,做奢侈品代工厂的网站大模型tokenizer层再训练(选取Qwen7B试验,重构token层) 最近公司可能想训练一个蛋白质大模型,需要了解一下大模型tokenizer重构,之后可能要训练,这里做了一定的总结。 文章目录 1. 首先查看Qwen2.5 7B基本…

大模型tokenizer层再训练(选取Qwen7B试验,重构token层)
最近公司可能想训练一个蛋白质大模型,需要了解一下大模型tokenizer重构,之后可能要训练,这里做了一定的总结。

文章目录

  • 1. 首先查看Qwen2.5 7B基本信息
  • 2. 重构tokenizer整体流程
    • 2.1 步骤一:准备语料
    • 2.2 步骤二:训练 tokenizer
      • 分词算法
      • BPE流程
      • 构建tokenizer
    • 2.3 步骤三:替换原模型目录中的 3 个 tokenizer 文件
    • 2.4 步骤四:加载 tokenizer,验证
    • 2.5 步骤五:加载、重构、保存模型
      • 加载模型 + 验证当前 embedding 尺寸
      • resize_token_embeddings(new_vocab_size) 调整维度
      • 保存新的模型权重 + tokenizer
    • 2.6 步骤六:检查
  • 3. 构建tokenizer核心:选择分词算法
    • 3.1 Word-level Tokenizer(词级分词器)
    • 3.2 Character-level Tokenizer(字符级)
    • 3.3 Byte-level Tokenizer(字节级)
    • 3.4 BPE (Byte Pair Encoding)
    • 3.5 WordPiece
    • 3.6 Unigram Language Model(概率模型)
    • 3.7 SentencePiece(分词框架)
    • 3.8 Tiktoken(OpenAI 专用)

1. 首先查看Qwen2.5 7B基本信息

✅ Tokenizer 加载成功!📌 类型: <class 'transformers.models.qwen2.tokenization_qwen2_fast.Qwen2TokenizerFast'>
📦 所使用的 tokenizer 文件: /home/liuzhao/models/Qwen/Qwen2___5-7B
🧱 词表大小(vocab size): 151643
🔢 特殊 token id: [PAD]: <|endoftext|> -> id: 151643[BOS]: None -> id: None[EOS]: <|endoftext|> -> id: 151643[UNK]: None -> id: None🧪 示例 token 编码:
Decoded: 你好,蛋白质'ä½łå¥½' -> 108386'ï¼Į' -> 3837'èĽĭçĻ½è´¨' -> 107151
Sliding Window Attention is enabled but not implemented for `sdpa`; unexpected results may be encountered.
Loading checkpoint shards: 100%|█████████████████████████████████████████████████████████████████████████████| 4/4 [00:08<00:00,  2.00s/it]✅ 模型加载成功!
📐 Embedding 层形状: torch.Size([152064, 3584])
🔢 Embedding 参数数量: 544997376📊 模型结构摘要:
Qwen2ForCausalLM((model): Qwen2Model((embed_tokens): Embedding(152064, 3584)(layers): ModuleList((0-27): 28 x Qwen2DecoderLayer((self_attn): Qwen2Attention((q_proj): Linear(in_features=3584, out_features=3584, bias=True)(k_proj): Linear(in_features=3584, out_features=512, bias=True)(v_proj): Linear(in_features=3584, out_features=512, bias=True)(o_proj): Linear(in_features=3584, out_features=3584, bias=False))(mlp): Qwen2MLP((gate_proj): Linear(in_features=3584, out_features=18944, bias=False)(up_proj): Linear(in_features=3584, out_features=18944, bias=False)(down_proj): Linear(in_features=18944, out_features=3584, bias=False)(act_fn): SiLU())(input_layernorm): Qwen2RMSNorm((3584,), eps=1e-06)(post_attention_layernorm): Qwen2RMSNorm((3584,), eps=1e-06)))(norm): Qwen2RMSNorm((3584,), eps=1e-06)(rotary_emb): Qwen2RotaryEmbedding())(lm_head): Linear(in_features=3584, out_features=152064, bias=False)
)📦 模型总参数量: 7,615,616,512

✅ 分析结果

🔹 Tokenizer 分析:

项目说明
Tokenizer 类Qwen2TokenizerFast使用 transformers 中快速实现,基于 tokenizer.model(SentencePiece)
词表大小151643表示 tokenizer 可用的 token 数量
[PAD] token`<endoftext
[EOS] token`<endoftext
[BOS] tokenNone未定义,模型可能默认不需要
[UNK] tokenNone未定义,可能使用 fallback 机制
示例编码token 输出乱码因为使用了 byte-level BPE,按字节切分后再 BPE,token 看似乱码但是正确的 UTF-8 字节表示

🔹 模型结构分析:

项目说明
Embedding 大小[152064, 3584]vocab size(包括 special tokens)为 152064,hidden size 为 3584
层数28Transformer decoder 层数
隐藏维度(hidden size)3584词向量维度,也是注意力/FFN 输入输出维度
Attention 参数KV projection 输出维度为 512使用 多头注意力 + 低秩投影(multi-query or grouped attention)优化推理速度
FFN维度(MLP)18944表示采用大容量前馈网络,约为 hidden size 的 5.3 倍
LayerNorm 类型Qwen2RMSNorm自定义 RMSNorm,代替标准 LayerNorm
Rotary Embedding支持 RoPE,用于 position encoding
输出层(lm_head)维度[3584, 152064]最终投影到 vocab 空间用于生成预测

2. 重构tokenizer整体流程

步骤操作工具/说明
1准备生物医药语料(每行一个样本)protein.txt
2使用 HuggingFace tokenizers 训练 tokenizer输出 tokenizer.json / vocab.json / tokenizer_config.json
3替换原模型目录中的 3 个 tokenizer 文件cp *.json Qwen2.5-7B/
4加载 tokenizer,验证 vocab size、分词逻辑AutoTokenizer.from_pretrained(…, trust_remote_code=True)
5加载模型,并执行 resize_token_embeddings(),重构embedding以及输出层,保存模型自动调整 embedding + lm_head
6检查 shape:model.get_input_embeddings().weight.shape 和 model.lm_head.weight.shape应该都是 (padded_vocab_size, hidden_size)

2.1 步骤一:准备语料

由于现在没有语料数据,暂时构建伪数据,尝试跑通流程:

/home/liuzhao/tokenizer_construct/fack_data/protein_mock.txt

MVHLTPEEKSAVTALWGKVNVDEVGGEALGRLLVVYPWTQ
MKVIFLGAVIGTILLISYGIR
MGDVEKGKKIFIMKCSQCHTVEKGGKHKTGPNLHGLFGRK
GAVAGVAGAAAKAAAKAAAKAA
MSTAVLGVLIFVGLVGMAAWTSRI
MAAAKAAAEAAAKAKAAAEAA
MEFVHLVYFGLVKGL
MNSFEMLRILGIIAASTLSLTI
MKAVLAGLVAVGLTVLAAAGA
MGGAVILFVLIGTFTALLAG

这 10 条伪序列涵盖了常见氨基酸字母(A、V、G、L、M、K、T、S、F、E…),不包含任何非法字符,适合 BPE/ByteLevel 分词训练。

2.2 步骤二:训练 tokenizer

分词算法

分词算法(Tokenization Algorithm)就是把原始文本(如“你好”或蛋白质序列)转换成模型能理解的离散符号(token)序列的过程。

它是大模型理解输入的第一步,决定了:

​ • 模型看到的“词”是啥?

​ • 每个 token 的 ID 是多少?

​ • 最终 embedding 层输入长什么样?

✅ 常见的分词算法一览(用于大语言模型 LLM)

分词算法所属模型/特点是否可训练优点缺点
Word-level古早模型(Word2Vec)❌ 预定义词表简单直观无法处理新词、词表爆炸
Character-levelGPT-Char、汉字模型❌ 固定单字不丢信息,适合小语种序列过长,不压缩
Byte-levelGPT2、Qwen2❌ 固定每个字节跨语言统一处理不压缩子词关系
BPE(Byte Pair Encoding)GPT2、Qwen2、LLama✅ 可训练平衡词频、可学习初始复杂,需 merge 文件
Unigram LM(SentencePiece)T5、mT5✅ 可训练支持多种粒度训练慢、实现复杂
WordPieceBERT✅ 可训练词干拼接,较紧凑不如 BPE 高效
TiktokenGPT-3.5 / 4(OpenAI)❌ 固定预定义极度高效封闭,无法训练

✅ 举例:

用蛋白质序列构建自己的 tokenizer,然后替换 Qwen2.5 的原生 tokenizer。

🧬 你的输入语料:

MVHLTPEEKSAVTALWGK...

这是蛋白质序列,由一串大写字母组成,每个字母表示一种氨基酸。

🧩 如果用不同分词算法会变成什么?

分词算法分词结果特点
Character-level[‘M’, ‘V’, ‘H’, ‘L’, ‘T’, …]每个氨基酸是一个 token
Byte-level BPE(你现在用的)[‘M’, ‘V’, ‘H’, ‘L’, ‘T’, ‘PE’, ‘EKS’, …]高频组合被合并为 token,压缩效果更好
Word-level整句作为一个 token(不适用)无法处理蛋白质
Tiktoken[‘MV’, ‘HL’, ‘TP’, ‘EE’, …](预定义)可能会错误分割
SentencePiece(Unigram)[‘MVHL’, ‘TP’, ‘EEKS’]基于语言概率构建,合并子序列更灵活

✅ 那么,分词算法的作用就是:

把一条「原始蛋白质序列」分解成适合模型使用的 token 序列,再将每个 token 映射成一个 ID,再送入 embedding 层中。

✅ ByteLevel BPE 有什么特别的?

ByteLevel BPE = Byte-level + BPE 合体

特性说明
ByteLevel文本按字节处理,支持各种字符集(中英文、特殊字符、符号、换行、空格)
BPE(可训练)高频子词自动 merge,词表更精简,更适合短词/序列建模
优势对蛋白质这种「结构性、定长、重复性高」的字符序列特别友好

所以我们说:

ByteLevel BPE 是当前 LLM 中最通用、兼容性最强、训练效率高的分词方法之一。

✅ 选 ByteLevel BPE 的理由:

原因说明
蛋白质本身是字符序列天然适合 ByteLevel
子串重复率高(如 AVAVAV)BPE merge 后可以变成一个 token,提升压缩效率
不需要复杂语义模型不像自然语言,要解析句法
想替换大模型(Qwen2.5)的 tokenizerQwen2 就是用 ByteLevel BPE,所以兼容性满分 ✅

✅ 最终总结:

分词算法是模型输入的第一道大门,不同算法决定了模型“看到的单位”是词、子词、字节还是字符;而 ByteLevel BPE 是一种兼具高效、灵活、可训练的主流方法,适用于你构建蛋白质 tokenizer 的任务。

BPE流程

完整可视化 BPE 的合并(merge)过程,包括:

  • 初始化状态;
  • 每轮统计 + 合并;
  • 最终得到词表(vocab)和合并规则(merges)。

✅ 示例文本语料:

我们用这个简单但有重复的英文短语做语料(共 4 条):

low lower lowest lowly

🧾 Step 1:初始化为字符级 token + <\w> 结尾标记

每个词都拆成字符 + 特殊符号 表示词结束:

原始词初始 token 序列
lowl o w
lowerl o w e r
lowestl o w e s t
lowlyl o w l y

🔁 Step 2:统计频率最高的相邻 token 对

我们数一下所有相邻字符对出现的次数:

Token Pair出现次数
(l, o)4 ✅
(o, w)4 ✅
(w, )1
(w, e)2
(e, r)1
(e, s)1
(s, t)1
(w, l)1
(l, y)1

🔨 Step 3:合并频次最高的 pair

我们选中 (‘l’, ‘o’) → “lo”,进行第一次 merge。

更新所有词:

更新后 token合并
lo w l+o ✅
lo w e r l+o ✅
lo w e s t l+o ✅
lo w l y l+o ✅

🔁 Step 4:继续迭代统计 + 合并

第 2 次 merge:

pair: (‘lo’, ‘w’) → “low”

更新后:

更新后 token
low
low e r
low e s t
low l y

第 3 次 merge:

pair: (‘low’, ‘e’) → “lowe”

更新:

low </w>
lowe r </w>
lowe s t </w>
low l y </w>

第 4 次 merge:

pair: (‘lowe’, ‘r’) → “lower”

更新:

low </w>
lower </w>
lower s t </w>
low l y </w>

第 5 次 merge:

pair: (‘lower’, ‘s’) → “lowers”

更新:

low </w>
lower </w>
lowers t </w>
low l y </w>

第 6 次 merge:

pair: (‘lowers’, ‘t’) → “lowest”

更新:

low </w>
lower </w>
lowest </w>
low l y </w>

第 7 次 merge:

pair: (‘low’, ‘l’) → “lowl”

然后再合并 (‘lowl’, ‘y’) → “lowly”

最终分词表:

原词最终 token 序列
low → low
lower → lower
lowest → lowest
lowly → lowly

🎉 每个词都被压缩成一个 token(理想情况),这就是 BPE 的“学习高频组合”的本事。

📦 最终 vocab(词表)示意:

{"l": 0,"o": 1,"w": 2,"e": 3,"r": 4,"s": 5,"t": 6,"y": 7,"</w>": 8,"lo": 9,"low": 10,"lowe": 11,"lower": 12,"lowers": 13,"lowest": 14,"lowl": 15,"lowly": 16
}

🪄 最终 merges.txt:

l o
lo w
low e
lowe r
lower s
lowers t
low l
lowl y

每一行就是一轮 merge 的规则,按顺序合并

🔎 总结一下流程:

步骤说明
初始化将词拆成字符,加词尾标记
多轮统计 + 合并每轮合并出现频率最高的相邻 token
构建 merges.txt合并记录即为 tokenizer 的“知识”
应用时分词遇到相同子串时就能直接编码为 token,提高效率

构建tokenizer

import os
import json
from tokenizers.implementations import ByteLevelBPETokenizer
from transformers import GPT2TokenizerFast# === 配置路径 ===
input_file = "/home/liuzhao/tokenizer_construct/fack_data/protein_mock.txt"
output_dir = "/home/liuzhao/tokenizer_construct/new_tokenizer"
vocab_size = 512  # 小语料建议设置小一点# === Step 1: 训练 ByteLevelBPE Tokenizer ===
tokenizer = ByteLevelBPETokenizer()# 特殊 token(你可以根据自己需求添加)
special_tokens = ["<|endoftext|>", "<unk>", "<pad>"]# 训练 tokenizer,生成 vocab.json + merges.txt
tokenizer.train(files=input_file,vocab_size=vocab_size,min_frequency=1,special_tokens=special_tokens,
)# 创建输出目录
os.makedirs(output_dir, exist_ok=True)# 保存 vocab.json / merges.txt
tokenizer.save_model(output_dir)# === Step 2: 写入 tokenizer_config.json,指定 tokenizer 类型为 GPT2 ===
tokenizer_config = {"model_type": "gpt2",  # 关键!明示为 GPT2-style,避免 tiktoken 报错"unk_token": "<unk>","eos_token": "<|endoftext|>","pad_token": "<pad>"
}with open(os.path.join(output_dir, "tokenizer_config.json"), "w") as f:json.dump(tokenizer_config, f)# === Step 3: 使用 GPT2TokenizerFast 加载 + 保存 HuggingFace 格式 ===
wrapped_tokenizer = GPT2TokenizerFast.from_pretrained(output_dir)
wrapped_tokenizer.save_pretrained(output_dir)# === Step 4: 打印验证信息 ===
print(f"✅ Tokenizer 构建成功,已保存至 {output_dir}")
print(f"🧱 词表大小: {wrapped_tokenizer.vocab_size}")
print(f"🔤 示例分词: {wrapped_tokenizer.tokenize('MVHLTPEEKS')}")

输出:

(tokenizer) root@420GP-252:/home/liuzhao/tokenizer_construct# python build_tokenizer.py 
[00:00:00] Pre-processing files (0 Mo)    █████████████████████████████████████████████████████████████████████                100%
[00:00:00] Tokenize words                 █████████████████████████████████████████████████████████████████████ 14       /       14
[00:00:00] Count pairs                    █████████████████████████████████████████████████████████████████████ 14       /       14
[00:00:00] Compute merges                 █████████████████████████████████████████████████████████████████████ 183      /      183
✅ Tokenizer 构建成功,已保存至 /home/liuzhao/tokenizer_construct/new_tokenizer
🧱 词表大小: 259
🔤 示例分词: ['M', 'V', 'H', 'L', 'T', 'P', 'E', 'E', 'K', 'S']

2.3 步骤三:替换原模型目录中的 3 个 tokenizer 文件

将生成的文件替换原来Qwen的tokenizer文件。

2.4 步骤四:加载 tokenizer,验证

# check_tokenizer_replacement.pyfrom transformers import AutoTokenizer
import os# 替换后的模型目录
tokenizer_dir = "/home/liuzhao/models/Qwen/Qwen2.5-7B-change"# 加载 tokenizer(关键:信任 remote_code)
tokenizer = AutoTokenizer.from_pretrained(tokenizer_dir,trust_remote_code=True
)# 打印基本信息
print("✅ Tokenizer 加载成功!\n")
print(f"📌 类型: {type(tokenizer)}")
print(f"📦 路径: {tokenizer.name_or_path}")
print(f"🧱 词表大小: {tokenizer.vocab_size}")# 分词验证(用你熟悉的蛋白质序列)
test_text = "MVHLTPEEKS"
tokens = tokenizer.tokenize(test_text)
token_ids = tokenizer.convert_tokens_to_ids(tokens)
decoded = tokenizer.decode(token_ids)print(f"\n🔤 分词结果: {tokens}")
print(f"🔢 Token IDs: {token_ids}")
print(f"🔁 解码还原: {decoded}")

输出:

(tokenizer) root@420GP-252:/home/liuzhao/tokenizer_construct# python check_tokenizer_replacement.py 
✅ Tokenizer 加载成功!📌 类型: <class 'transformers.models.gpt2.tokenization_gpt2_fast.GPT2TokenizerFast'>
📦 路径: /home/liuzhao/models/Qwen/Qwen2.5-7B-change
🧱 词表大小: 259🔤 分词结果: ['M', 'V', 'H', 'L', 'T', 'P', 'E', 'E', 'K', 'S']
🔢 Token IDs: [47, 56, 42, 46, 54, 50, 39, 39, 45, 53]
🔁 解码还原: MVHLTPEEKS

2.5 步骤五:加载、重构、保存模型

第 5 步:模型结构调整阶段

✅ 第五步任务总目标:

让模型结构(特别是 embedding 层和输出层 lm_head)的维度,匹配你新 tokenizer 的词表大小(vocab_size),确保 forward 时不会报错或 shape mismatch。

🎯 第五步重新拆解为 3 个子任务(建议逐步执行):

加载模型 + 验证当前 embedding 尺寸

内容
✅ 检查当前 embedding 层 Embedding(num_embeddings, hidden_size) 的维度
✅ 检查 lm_head 的输出维度是否一致
✅ 打印当前 vocab_size 与 tokenizer vocab 是否对齐

✅ 示例输出结构检查:

print(model.model.embed_tokens.weight.shape)
print(model.lm_head.out_features)

resize_token_embeddings(new_vocab_size) 调整维度

model.resize_token_embeddings(new_vocab_size)
调整的内容说明
model.model.embed_tokensembedding 层的 token 数变成新 vocab size(如 259)
model.lm_head输出维度也会同步调整(transformers 自动处理)

保存新的模型权重 + tokenizer

​ • 保存为 Qwen2.5-7B-with-protein-tokenizer/

​ • 之后可以重新加载、微调或推理

model.save_pretrained(output_dir)
tokenizer.save_pretrained(output_dir)

resize_model_embedding.py

import os
from transformers import AutoTokenizer, AutoModelForCausalLM# === 路径配置 ===
model_path = "/home/liuzhao/models/Qwen/Qwen2.5-7B-change"
output_path = "/home/liuzhao/models/Qwen/Qwen2.5-7B-with-protein-tokenizer"# === Step 1: 加载 tokenizer 和模型 ===
print("📦 加载 tokenizer 和模型...")
tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(model_path, trust_remote_code=True)print("✅ 加载完成!")
print(f"🔢 当前 tokenizer.vocab_size: {tokenizer.vocab_size}")
print(f"📐 原始 embedding 层形状: {model.model.embed_tokens.weight.shape}")
print(f"📐 原始 lm_head 输出形状: {model.lm_head.out_features}")# === Step 2: 调整 embedding 和输出层大小 ===
print("\n🔧 执行 resize_token_embeddings ...")
model.resize_token_embeddings(tokenizer.vocab_size)# 再次打印新形状
print(f"✅ 新 embedding 层形状: {model.model.embed_tokens.weight.shape}")
print(f"✅ 新 lm_head 输出形状: {model.lm_head.out_features}")# === Step 3: 保存新模型和 tokenizer ===
print(f"\n💾 保存模型和 tokenizer 到: {output_path}")
os.makedirs(output_path, exist_ok=True)
model.save_pretrained(output_path)
tokenizer.save_pretrained(output_path)print("\n🎉 完成!模型已保存并可用于推理或微调。")

输出:

(tokenizer) root@420GP-252:/home/liuzhao/tokenizer_construct# python resize_model_embedding.py 
📦 加载 tokenizer 和模型...
Sliding Window Attention is enabled but not implemented for `sdpa`; unexpected results may be encountered.
Loading checkpoint shards: 100%|█████████████████████████████████████████████████████████████████████| 4/4 [00:05<00:00,  1.42s/it]
✅ 加载完成!
🔢 当前 tokenizer.vocab_size: 259
📐 原始 embedding 层形状: torch.Size([152064, 3584])
📐 原始 lm_head 输出形状: 152064🔧 执行 resize_token_embeddings ...
✅ 新 embedding 层形状: torch.Size([259, 3584])
✅ 新 lm_head 输出形状: 259💾 保存模型和 tokenizer 到: /home/liuzhao/models/Qwen/Qwen2.5-7B-with-protein-tokenizer🎉 完成!模型已保存并可用于推理或微调。

2.6 步骤六:检查

首先检查tokenizer以及模型:

✅ Tokenizer 加载成功!📌 类型: <class 'transformers.models.gpt2.tokenization_gpt2_fast.GPT2TokenizerFast'>
📦 所使用的 tokenizer 文件: /home/liuzhao/models/Qwen/Qwen2.5-7B-with-protein-tokenizer
🧱 词表大小(vocab size): 259
🔢 特殊 token id: [PAD]: <pad> -> id: 2[BOS]: <|endoftext|> -> id: 0[EOS]: <|endoftext|> -> id: 0[UNK]: <unk> -> id: 1🧪 示例 token 编码:
Decoded: 你好,蛋白质'ä' -> 163'½' -> 124'ł' -> 257'å' -> 164'¥' -> 101'½' -> 124'ï' -> 174'¼' -> 123'Į' -> 237'è' -> 167'Ľ' -> 252'ĭ' -> 236'ç' -> 166'Ļ' -> 250'½' -> 124'è' -> 167'´' -> 115'¨' -> 104
Sliding Window Attention is enabled but not implemented for `sdpa`; unexpected results may be encountered.
Loading checkpoint shards: 100%|█████████████████████████████████████████████████████████████████████| 6/6 [00:05<00:00,  1.13it/s]✅ 模型加载成功!
📐 Embedding 层形状: torch.Size([259, 3584])
🔢 Embedding 参数数量: 928256📊 模型结构摘要:
Qwen2ForCausalLM((model): Qwen2Model((embed_tokens): Embedding(259, 3584)(layers): ModuleList((0-27): 28 x Qwen2DecoderLayer((self_attn): Qwen2Attention((q_proj): Linear(in_features=3584, out_features=3584, bias=True)(k_proj): Linear(in_features=3584, out_features=512, bias=True)(v_proj): Linear(in_features=3584, out_features=512, bias=True)(o_proj): Linear(in_features=3584, out_features=3584, bias=False))(mlp): Qwen2MLP((gate_proj): Linear(in_features=3584, out_features=18944, bias=False)(up_proj): Linear(in_features=3584, out_features=18944, bias=False)(down_proj): Linear(in_features=18944, out_features=3584, bias=False)(act_fn): SiLU())(input_layernorm): Qwen2RMSNorm((3584,), eps=1e-06)(post_attention_layernorm): Qwen2RMSNorm((3584,), eps=1e-06)))(norm): Qwen2RMSNorm((3584,), eps=1e-06)(rotary_emb): Qwen2RotaryEmbedding())(lm_head): Linear(in_features=3584, out_features=259, bias=False)
)📦 模型总参数量: 6,527,478,272

test_model_with_protein_tokenizer.py

from transformers import AutoTokenizer, AutoModelForCausalLM
import torch# === 路径配置 ===
model_path = "/home/liuzhao/models/Qwen/Qwen2.5-7B-with-protein-tokenizer"# === Step 6.1: 加载 tokenizer 和模型 ===
print("📦 加载 tokenizer 和模型...")
tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(model_path, trust_remote_code=True)
model.eval()  # 推理用print("✅ 加载完成!\n")# === Step 6.2: 打印模型结构参数 ===
print(f"📌 Tokenizer 类型: {type(tokenizer)}")
print(f"🧱 词表大小: {tokenizer.vocab_size}")
print(f"📐 Embedding 层形状: {model.model.embed_tokens.weight.shape}")
print(f"📊 Transformer 层数: {len(model.model.layers)}")
print(f"📐 输出层形状 (lm_head): {model.lm_head.weight.shape}\n")# === Step 6.3: 简单推理测试 ===
test_input = "MVHLTPEEKSAVTALWGKVNV"  # 一段蛋白质序列
inputs = tokenizer(test_input, return_tensors="pt")print("🔍 输入 token IDs:", inputs["input_ids"][0].tolist())# 推理(限制最大长度防止 OOM)
with torch.no_grad():outputs = model.generate(input_ids=inputs["input_ids"],max_new_tokens=20,do_sample=False)# 解码输出
decoded = tokenizer.decode(outputs[0])
print("\n🧪 推理结果:")
print(decoded)

输出:

(tokenizer) root@420GP-252:/home/liuzhao/tokenizer_construct# CUDA_VISIBLE_DEVICES=5 python test_model_with_protein_tokenizer.py 
📦 加载 tokenizer 和模型...
Sliding Window Attention is enabled but not implemented for `sdpa`; unexpected results may be encountered.
Loading checkpoint shards: 100%|█████████████████████████████████████████████████████████████████████| 6/6 [00:05<00:00,  1.03it/s]
✅ 加载完成!📌 Tokenizer 类型: <class 'transformers.models.gpt2.tokenization_gpt2_fast.GPT2TokenizerFast'>
🧱 词表大小: 259
📐 Embedding 层形状: torch.Size([259, 3584])
📊 Transformer 层数: 28
📐 输出层形状 (lm_head): torch.Size([259, 3584])🔍 输入 token IDs: [47, 56, 42, 46, 54, 50, 39, 39, 45, 53, 35, 56, 54, 35, 46, 57, 41, 45, 56, 48, 56]
The attention mask and the pad token id were not set. As a consequence, you may observe unexpected behavior. Please pass your input's `attention_mask` to obtain reliable results.
Setting `pad_token_id` to `eos_token_id`:151643 for open-end generation.
The attention mask is not set and cannot be inferred from input because pad token is same as eos token. As a consequence, you may observe unexpected behavior. Please pass your input's `attention_mask` to obtain reliable results.🧪 推理结果:
MVHLTPEEKSAVTALWGKVNVGVGVGVGVGVGVGVGVGVGV

3. 构建tokenizer核心:选择分词算法

通过构建tokenizer的整体流程来看,核心其实是第二步:训练tokenizer。这一步设计到分词算法的选择

✅ 常用分词算法总览表(用途 × 原理 × 特性 × 模型支持)

分词算法是否可训练是否支持 OOV压缩能力粒度原理简介常用模型/场景
Word-level❌ 否❌ 差❌ 差按空格分词,每个词是一个 tokenWord2Vec(早期)、GloVe
Character-level❌ 否✅ 好❌ 差字/字符每个字符是一个 token,无需词表拼音、蛋白质、语音转写
Byte-level❌ 否✅ 很好❌ 差字节(UTF-8)每个字符拆成 1-4 字节,再用 Byte 作为 tokenOpenAI GPT 系列(GPT-3/4)、tiktoken
BPE (Byte Pair Encoding)✅ 是✅ 良好✅ 高子词高频字符对合并,构造合成词单元GPT2、LLama、Qwen、CodeGen
WordPiece✅ 是✅ 良好✅ 一般子词最大匹配 + 子词合并BERT、ALBERT
Unigram Language Model✅ 是✅ 最好✅ 很高子词训练一个概率模型,保留最优子词集T5、mT5、XLM-R、SentencePiece
SentencePiece (框架)✅ 是✅ 强✅ 强子词/字节支持 Unigram/BPE/Char/Byte 等算法Google 系列、跨语种任务
Tiktoken❌ 否✅ 固定词表✅ 非常高字节OpenAI 内部算法,压缩+速度双优GPT-3.5、GPT-4(不可训练)

3.1 Word-level Tokenizer(词级分词器)

原理:按空格或分隔符将文本切分为完整词语。

优点

直观易理解

缺点

词表庞大,难以覆盖 OOV(未登录词)

无法泛化:如“play”和“played”是两个不同词

常见模型:Word2Vec、GloVe(早期传统方法)

3.2 Character-level Tokenizer(字符级)

原理:将每个字符(如汉字、英文字母、氨基酸等)当作一个 token。

优点

完全无 OOV 问题

极细粒度,适合结构化序列(如蛋白质)

缺点

序列太长,建模成本高

应用:蛋白质序列、拼音建模、小语种处理

3.3 Byte-level Tokenizer(字节级)

原理:将文本按 UTF-8 字节编码,每个字节为一个 token,共 256 种。

优点

无语言依赖,支持所有字符

与 GPT2、OpenAI 模型兼容性好

缺点

不会做词级压缩(每个 token 都很短)

代表实现:GPT2、Qwen2、OpenAI 的 Tiktoken

3.4 BPE (Byte Pair Encoding)

原理

从字符出发,按频率合并最常出现的 token 对,逐步构造子词

优点

可训练

高压缩比,子词有语义组合能力

高效通用,适用于各种语种和符号结构

缺点

只考虑合并频率,缺少语言建模概率

应用模型:GPT2、LLama、Qwen、CodeGen、RoBERTa(BPE with space)

3.5 WordPiece

原理

按最大匹配方式将词拆解成子词,子词带 ## 前缀表示后缀部分

优点

控制好拆分与组合平衡,稳定性强

缺点

构建过程比 BPE 更复杂

常见模型:BERT、ALBERT、DistilBERT、Electra

3.6 Unigram Language Model(概率模型)

原理

从一大批子词候选集中,选择能最优压缩文本概率的子词集合

每个词有多种拆分路径,选择最优的

优点

最灵活可控、最适配多语种场景

缺点

构建耗时较长,训练复杂

常见模型:T5、mT5、XLM-R、Google 系列

3.7 SentencePiece(分词框架)

本质是框架,支持以下算法:

✅ Unigram(默认)

✅ BPE

✅ Character

✅ Byte

支持无空格语言(如中文、日文)

常见于 Google / multilingual 模型

3.8 Tiktoken(OpenAI 专用)

​ • 原理:压缩优化过的 UTF-8 字节映射 + 快速查表

​ • 特点

​ • 封闭系统,无法训练

​ • 提供极高推理效率和兼容性

​ • 常见模型:GPT-3.5、GPT-4(不可替换)

支持自训练的分词算法有哪些?

可自训练?算法
✅ 可以BPE, Unigram, WordPiece, SentencePiece
❌ 固定Char-level, Byte-level, Tiktoken

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/899219.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VectorBT:使用PyTorch+LSTM训练和回测股票模型 进阶一

VectorBT&#xff1a;使用PyTorchLSTM训练和回测股票模型 进阶一 本文介绍了如何使用PyTorch和LSTM模型进行股票数据的训练和回测。涵盖了数据预处理、特征选择、LSTM模型构建、模型训练与验证、动态阈值策略生成交易信号以及使用VectorBT进行回测和绩效分析。 文中内容仅限技术…

MantisBT在Windows10上安装部署详细步骤

MantisBT 是一款基于 Web 的开源缺陷跟踪系统&#xff0c;以下是在 Windows 10 上安装部署 MantisBT 的详细步骤&#xff1a; 1. 安装必要的环境 MantisBT 是一个基于 PHP 的 Web 应用程序&#xff0c;因此需要安装 Web 服务器&#xff08;如 Apache&#xff09;、PHP 和数据…

深入理解K8s与Docker的关系:容器化技术的双雄

友情提示&#xff1a;本文内容由银河易创&#xff08;https://ai.eaigx.com&#xff09;AI创作平台gpt-4-turbo模型生成&#xff0c;仅供参考。 在现代云计算及微服务架构的发展中&#xff0c;Docker与Kubernetes&#xff08;K8s&#xff09;作为两大核心技术&#xff0c;被广泛…

蓝桥与力扣刷题(蓝桥 蓝桥骑士)

题目&#xff1a;小明是蓝桥王国的骑士&#xff0c;他喜欢不断突破自我。 这天蓝桥国王给他安排了 N 个对手&#xff0c;他们的战力值分别为 a1,a2,...,an&#xff0c;且按顺序阻挡在小明的前方。对于这些对手小明可以选择挑战&#xff0c;也可以选择避战。 身为高傲的骑士&a…

如何查看window电脑的GPU信息

GPU&#xff08;图形处理器&#xff0c;Graphics Processing Unit&#xff09;和显卡是两个密切相关但不同的概念 概念 1. ‌基本概念‌ ‌GPU‌&#xff1a;是专门用于处理图像和视频信息的微处理器&#xff0c;拥有强大的并行计算能力&#xff0c;主要负责图形渲染、数值分…

26考研——查找_树形查找_二叉排序树(BST)(7)

408答疑 文章目录 三、树形查找二叉排序树&#xff08;BST&#xff09;二叉排序树中结点值之间的关系二叉树形查找二叉排序树的查找过程示例 向二叉排序树中插入结点插入过程示例 构造二叉排序树的过程构造示例 二叉排序树中删除结点的操作情况一&#xff1a;被删除结点是叶结点…

如何在 Postman 中导入和导出 cURL 命令?

cURL 是一款广受欢迎的命令行工具&#xff0c;专门用于执行 HTTP 请求。它在 Web 应用或 API 测试中极为实用&#xff0c;让用户得以借助在 API 开发者社区广为流行的成熟语法&#xff0c;直接通过命令行与 API 进行交互。若你需要在多个环境下运行众多 cURL 命令&#xff0c;可…

用python制作一个贪吃蛇小游戏

文章目录 效果图python源码使用说明效果图 只需要一百多行python代码,就能制作一个贪吃蛇小游戏。效果如下: 操作说明: 你可以使用上下左右箭头键来控制蛇的移动方向。蛇吃到食物后会变长,当蛇撞到墙壁或自己的身体时游戏结束。游戏结束后,你可以按 Q 退出游戏,或按 C…

react 15-16-17-18各版本的核心区别、底层原理及演进逻辑的深度解析

一、React 15&#xff08;2016&#xff09; 核心架构&#xff1a;Stack Reconciler&#xff08;栈协调器&#xff09; 工作原理&#xff1a; 同步递归渲染&#xff1a;采用深度优先遍历方式递归处理 Virtual DOM&#xff0c;形成不可中断的调用栈渲染流程&#xff1a;1. 触发 …

微信小程序pdf预览

1.示例图 2.代码 fileId&#xff1a;要预览的pdf文件的id viewsFiles(fileId) {wx.showLoading({title: 加载中...});var params {url: "/common/getFile/" fileId ,//后端提供的接口method: "GET",responseType: "arraybuffer",callBack: …

把手搭建vue前后端管理系统-TAB标签通过pinia来进行管理(二十六)

目标&#xff1a;通过pinia的store来进行组件状态的统一管理&#xff0c;这样大家都可以共用到这个组件的状态信息&#xff0c;就可以实现组件的联动 一、添加侧边栏菜单的点击事件&#xff1a; 1、CommonAside.vue里面添加click的事件 <el-menu-itemv-for"item in …

计算机网络——数据链路层的功能

目录 物理链路 逻辑链路 封装成帧&#xff08;组帧&#xff09; 帧定界 透明传输 SDU 差错控制 可靠传输 流量控制 介质访问控制 主机需要实现第一层到第五层的功能&#xff0c;而路由器这种节点只需要实现第一层到第三层的这些功能 假设左边用户需要给右边用户发送…

数据抓取的缓存策略:减少重复请求与资源消耗

在数据采集领域&#xff0c;爬虫效率是决定项目成败的关键因素之一。传统的爬虫架构往往因请求频繁、资源消耗较大以及重复抓取等问题&#xff0c;导致效率低下。这些问题不仅拖慢了数据获取的速度&#xff0c;还可能引发目标服务器的过载风险&#xff0c;甚至导致爬虫被限制。…

k8s部署argocd

前言 ArgoCD是一个基于Kubernetes的GitOps持续交付工具&#xff0c;应用的部署和更新都可以在Git仓库上同步实现&#xff0c;并自带一个可视化界面。本文介绍如何使用GitHelmArgocd方式来实现在k8s中部署和更新应用服务&#xff1b; 安装Argocd 准备一个k8s集群&#xff0c;然…

【Linux】MAC帧

目录 一、MAC帧 &#xff08;一&#xff09;IP地址和MAC地址 &#xff08;二&#xff09;MAC帧格式 &#xff08;三&#xff09;MTU对IP协议的影响、 &#xff08;四&#xff09;MTU对UDP协议的影响 &#xff08;五&#xff09;MTU对TCP协议的影响 二、以太网协议 &…

【Unity3D】摄像机适配场景以及Canvas适配

目录 宽度不变策略 高度不变策略 宽度不变策略 开发分辨率 750*1334 (宽高比:0.56) 真机分辨率 1170*2532 (宽高比:0.46) 真机宽高比<开发宽高比&#xff0c;采用宽度不变策略 理由&#xff1a;小于代表真机高度比开发高度更大&#xff0c;因此不需要担心高度上…

二叉树的前,中,后序遍历

我们来了解一下二叉树的遍历&#xff0c;话不多说 二叉树的遍历的概念&#xff1a; 二叉树有四种遍历方式&#xff0c;分别为前序遍历&#xff0c;中序遍历&#xff0c;后序遍历和层序遍历&#xff0c;但我们今天谈谈前三种&#xff0c;并实现它 前序遍历&#xff1a; 按照根…

golang Error的一些坑

golang Error的一些坑 golang error的设计可能是被人吐槽最多的golang设计了。 最经典的err!nil只影响代码风格设计&#xff0c;而有一些坑会导致我们的程序发生一些与我们预期不符的问题&#xff0c;开发过程中需要注意。 ​​ errors.Is​判断error是否Wrap不符合预期 ​…

逼用户升级Win11,微软开始给Win10限速

随着Windows10的支持时间越来越短&#xff0c;微软也加大了对Win10用户的驱赶力度。 最近&#xff0c;微软官宣了将要在今年6月份降低OneNote for Windows 10的同步速度。软件也将和Windows10在今年的10月14日一同停止支持和维护。 这将影响实时协作和多设备访问。 对OneNote…

SpringMVC_day02

一、SSM 整合 核心步骤 依赖管理 包含 SpringMVC、Spring JDBC、MyBatis、Druid 数据源、Jackson 等依赖。注意点&#xff1a;确保版本兼容性&#xff08;如 Spring 5.x 与 MyBatis 3.5.x&#xff09;。 配置类 SpringConfig&#xff1a;扫描 Service 层、启用事务管理、导入…