You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

加载Meta-Llama-3.1-8B-Instruct遇tokenizer解析错误,求指导

解决Meta-Llama-3.1-8B-Instruct模型加载失败问题

一、Tokenizer加载错误修复

报错核心原因是直接传入单个tokenizer.model文件路径给LlamaTokenizer.from_pretrained(),且该方法已不推荐直接加载单个文件。正确做法是手动用SentencePiece加载模型后初始化Tokenizer:

from sentencepiece import SentencePieceProcessor
from transformers import LlamaTokenizer

tokenizer_path = 'Meta-Llama-3.1-8B-Instruct/tokenizer.model'
sp_processor = SentencePieceProcessor()
sp_processor.Load(tokenizer_path)

# 适配Llama 3.1的Tokenizer初始化
tokenizer = LlamaTokenizer(
    vocab_file=None,
    tokenizer_file=tokenizer_path,
    legacy=False,
    bos_token_id=128000,
    eos_token_id=128001
)

二、模型配置参数修正

你的intermediate_size设置为小数会触发错误,需按照params.json规则计算:

  • 公式:intermediate_size = 向上取整(dim * ffn_dim_multiplier / multiple_of) * multiple_of
  • 计算结果:ceil(4096*1.3/1024)*1024 = 6144

同时补充params.json中的其他关键参数:

from transformers import LlamaConfig

model_config = LlamaConfig(
    hidden_size=4096,
    num_hidden_layers=32,
    num_attention_heads=32,
    num_key_value_heads=8,  # 对应params中的n_kv_heads
    intermediate_size=6144,
    vocab_size=128256,
    norm_eps=1e-05,
    rope_theta=500000.0,
    use_scaled_rope=True,
    bos_token_id=128000,
    eos_token_id=128001
)

三、原生权重转Transformers格式

原生consolidated.00.pth的权重键名与Transformers的Llama模型不匹配,需手动映射转换:

import torch

# 加载原生权重
raw_weights = torch.load('Meta-Llama-3.1-8B-Instruct/consolidated.00.pth')

# 键名映射函数
def map_key(key):
    key = key.replace('tok_embeddings.', 'embed_tokens.')
    key = key.replace('norm.', 'model.norm.')
    key = key.replace('output.', 'lm_head.')
    if 'layers.' in key:
        parts = key.split('.')
        layer_idx = parts[1]
        rest = '.'.join(parts[2:])
        rest = rest.replace('attention.wq.', 'self_attn.q_proj.')
        rest = rest.replace('attention.wk.', 'self_attn.k_proj.')
        rest = rest.replace('attention.wv.', 'self_attn.v_proj.')
        rest = rest.replace('attention.wo.', 'self_attn.o_proj.')
        rest = rest.replace('feed_forward.w1.', 'mlp.gate_proj.')
        rest = rest.replace('feed_forward.w2.', 'mlp.down_proj.')
        rest = rest.replace('feed_forward.w3.', 'mlp.up_proj.')
        rest = rest.replace('attention_norm.', 'input_layernorm.')
        rest = rest.replace('ffn_norm.', 'post_attention_layernorm.')
        return f'model.layers.{layer_idx}.{rest}'
    return key

# 转换权重并加载到模型
transformers_weights = {map_key(k): v for k, v in raw_weights.items()}
model = LlamaForCausalLM(config=model_config)
model.load_state_dict(transformers_weights)
model.eval()

四、完整可运行代码

import torch
from sentencepiece import SentencePieceProcessor
from transformers import LlamaTokenizer, LlamaForCausalLM, LlamaConfig

model_path = 'Meta-Llama-3.1-8B-Instruct'

# 加载Tokenizer
tokenizer_path = f'{model_path}/tokenizer.model'
sp_processor = SentencePieceProcessor()
sp_processor.Load(tokenizer_path)

tokenizer = LlamaTokenizer(
    vocab_file=None,
    tokenizer_file=tokenizer_path,
    legacy=False,
    bos_token_id=128000,
    eos_token_id=128001
)

# 配置模型
model_config = LlamaConfig(
    hidden_size=4096,
    num_hidden_layers=32,
    num_attention_heads=32,
    num_key_value_heads=8,
    intermediate_size=6144,
    vocab_size=128256,
    norm_eps=1e-05,
    rope_theta=500000.0,
    use_scaled_rope=True,
    bos_token_id=128000,
    eos_token_id=128001
)

# 加载并转换权重
raw_weights = torch.load(f'{model_path}/consolidated.00.pth')

def map_key(key):
    key = key.replace('tok_embeddings.', 'embed_tokens.')
    key = key.replace('norm.', 'model.norm.')
    key = key.replace('output.', 'lm_head.')
    if 'layers.' in key:
        parts = key.split('.')
        layer_idx = parts[1]
        rest = '.'.join(parts[2:])
        rest = rest.replace('attention.wq.', 'self_attn.q_proj.')
        rest = rest.replace('attention.wk.', 'self_attn.k_proj.')
        rest = rest.replace('attention.wv.', 'self_attn.v_proj.')
        rest = rest.replace('attention.wo.', 'self_attn.o_proj.')
        rest = rest.replace('feed_forward.w1.', 'mlp.gate_proj.')
        rest = rest.replace('feed_forward.w2.', 'mlp.down_proj.')
        rest = rest.replace('feed_forward.w3.', 'mlp.up_proj.')
        rest = rest.replace('attention_norm.', 'input_layernorm.')
        rest = rest.replace('ffn_norm.', 'post_attention_layernorm.')
        return f'model.layers.{layer_idx}.{rest}'
    return key

transformers_weights = {map_key(k): v for k, v in raw_weights.items()}
model = LlamaForCausalLM(config=model_config)
model.load_state_dict(transformers_weights)
model.eval()

# 生成文本
input_text = "Hello, how are you?"
inputs = tokenizer(input_text, return_tensors='pt')

with torch.no_grad():
    outputs = model.generate(
        inputs['input_ids'],
        max_new_tokens=50,
        temperature=0.7,
        do_sample=True
    )

decoded_output = tokenizer.decode(outputs[0], skip_special_tokens=True)
print(decoded_output)

内容的提问来源于stack exchange,提问作者Alhusain Alharthi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 01:17:01