原贴链接

以下是我所做的操作

from transformers import AutoTokenizer, AutoConfig, AutoModelForCausalLM, LlamaConfig, LlamaForCausalLM, LlamaTokenizer, TextStreamer
from copy import deepcopy
import torch

model_name_or_path = "upstage/TinySolar-248m-4k"
pretrained_model = AutoModelForCausalLM.from_pretrained(
    model_name_or_path,
    device_map="cpu",
    torch_dtype=torch.bfloat16,    
)

tokenizer = LlamaTokenizer.from_pretrained(model_dir)

# 为新模型创建配置
config = LlamaConfig(
    num_hidden_layers=10,
    hidden_size=1024,
    intermediate_size=4096,
    num_attention_heads=32,
    num_key_value_heads=8,
    torch_dtype="bfloat16",
    use_cache=False 
)

# 创建新模型
model = LlamaForCausalLM(config)

# 通过复制预训练模型的权重来缩减模型
model.model.layers = deepcopy(pretrained_model.model.layers[:5]) + deepcopy(pretrained_model.model.layers[-5:])

# 我们甚至复制了embed_tokens和lm_head
model.model.embed_tokens = deepcopy(pretrained_model.model.embed_tokens)

model.lm_head = deepcopy(pretrained_model.lm_head)

# 推理模型
prompt = "我是一名程序员。我喜欢"

inputs = tokenizer(prompt, return_tensors="pt").to(model.device)

streamer = TextStreamer(
    tokenizer, 
    skip_prompt=True, 
    skip_special_tokens=True
)

outputs = model.generate(
    **inputs, 
    streamer=streamer, 
    use_cache=True, 
    max_new_tokens=64, 
    do_sample=False
)

然后我得到了以下错误

------------------------------------------------------------------------------------------------------------------------------------------------------



IndexError                                Traceback (most recent call last)


 in <cell line: 47>()
     45 )
     46 
---> 47 outputs = model.generate(
     48     **inputs,
     49     streamer=streamer,

<ipython-input-7-80dba83d0811>

15 frames

 in update(self, key_states, value_states, layer_idx, cache_kwargs)
    364             self.value_cache[layer_idx] = torch.cat([self.value_cache[layer_idx], value_states], dim=-2)
    365 
--> 366         return self.key_cache[layer_idx], self.value_cache[layer_idx]
    367 
    368     def get_seq_length(self, layer_idx: Optional[int] = 0) -> int:

/usr/local/lib/python3.10/dist-packages/transformers/cache_utils.py

IndexError: list index out of range

IndexError                                Traceback (most recent call last)


 in <cell line: 47>()
     45 )
     46 
---> 47 outputs = model.generate(
     48     **inputs,
     49     streamer=streamer,

<ipython-input-7-80dba83d0811>

但是当我进行放大时,我没有遇到任何错误,以下是放大时的更改

# 取预训练模型的前8层和后8层
model.model.layers = deepcopy(pretrained_model.model.layers[:-4]) + deepcopy(pretrained_model.model.layers[4:])

# 我们甚至复制了embed_tokens和lm_head
model.model.embed_tokens = deepcopy(pretrained_model.model.embed_tokens)

model.lm_head = deepcopy(pretrained_model.lm_head)model.model.layers = deepcopy(pretrained_model.model.layers[:-4]) + deepcopy(pretrained_model.model.layers[4:])


# 我们甚至复制了embed_tokens和lm_head
model.model.embed_tokens = deepcopy(pretrained_model.model.embed_tokens)


model.lm_head = deepcopy(pretrained_model.lm_head)

config = LlamaConfig(
    num_hidden_layers=16,  
    hidden_size=1024,
    intermediate_size=4096,
    num_attention_heads=32,
    num_key_value_heads=8,
    torch_dtype="bfloat16",
    use_cache=False 
)

当我进行model.generate时,这确实给了我输出(尽管模型会失去连贯性,我需要预训练几个周期)

所以我的疑问是,为什么在缩减时会出现错误?我只是移除了一些解码器层,这不应该影响它,对吧?

讨论总结

本次讨论主要集中在使用Python的transformers库进行模型缩放时遇到的“List out of Index”错误。发帖者分享了他们的代码和错误信息,特别是当尝试缩小模型时出现的错误,而在放大模型时则没有问题。讨论中涉及了模型配置、层复制和缓存处理等技术细节,但没有具体的评论参与讨论。

主要观点

  1. 👍 模型缩放时的错误
    • 支持理由:发帖者详细描述了在缩小模型时遇到的“List out of Index”错误,这表明在处理模型层时可能存在索引问题。
    • 反对声音:无具体反对声音,但需要进一步的技术分析来确定错误的确切原因。

金句与有趣评论

  1. “😂 无具体评论”
    • 亮点:由于没有具体评论,无法提供有趣的观点或金句。

情感分析

讨论的总体情感倾向是技术性的,主要集中在解决技术问题和理解错误原因上。由于没有具体评论,情感倾向较为中性。

趋势与预测

  • 新兴话题:可能会有更多关于transformers库中模型缩放和缓存处理的讨论。
  • 潜在影响:正确理解和解决此类技术问题对于机器学习和深度学习领域的开发者至关重要,有助于提高模型处理的效率和稳定性。