聪明的新电脑

71 阅读5分钟

在上周,我觉得我过得特别充实,感觉自己的日程安排得非常好,完成了很多任务。我甚至觉得自己好像跨越了一个大台阶,做了许多有意义的事情。特别是我获得了一台新的电脑,正是我梦寐以求的苹果MacBook Pro,它搭载了最新的M4 Pro芯片。不得不说,这款芯片真的是太强大了,速度快到让我惊叹。我一直听说苹果的芯片很强大,但亲自体验之后,才真正感受到它的强劲性能。无论是打开软件还是处理数据,都是非常流畅的,简直没有任何卡顿,感觉电脑一下子变得非常“聪明”。

image.png 我用这台新的MacBook Pro干了很多事情。首先,我下载了很多机器学习的模型,并且尝试在本地运行它们。对于我来说,这种体验非常新鲜,因为之前我的电脑性能较差,很多复杂的模型根本无法运行,但现在有了M4 Pro芯片,整个过程顺畅得多。我不仅仅是用这些模型来跑数据,我还尝试了微调。这对于我来说是一个新的挑战,因为微调模型是机器学习中的一个重要环节,它可以让模型更好地适应特定的任务。刚开始的时候,我对微调并不是很熟悉,感觉有点复杂,但我通过不断学习和实践,慢慢掌握了微调的技巧。我在网络上查找了很多资料。通过这些方法,我终于成功地微调了一些模型,并且学到了很多有关深度学习的知识。

image.png 除了学习机器学习,我还读了一本特别有意义的书——《居里夫人自传》。这本书让我深受触动,尤其是在读到居里夫人如何坚持自己的科学梦想时,我感受到了她那种坚韧不拔的精神。居里夫人不仅是一个伟大的科学家,她还是一个不畏艰难、追求真理的人。书中提到,居里夫人一心一意地投入到科学研究中,尽管她面临着无数困难和挑战,但她从未放弃。她的坚持和毅力让我感到非常敬佩,也让我明白了一个道理:只要你真心热爱一件事情,不管前路多么困难,只要不放弃,你就一定能够有所成就。

在我学习和实践的过程中,我还干了一件特别有意思的事情。那就是我将我的国行MacBook Pro添加了一个叫做“Apple Intelligence”的功能,并且开启了Xcode中的LLM(大语言模型)方案。这是苹果提供的一个非常先进的工具,能够帮助开发者更好地利用机器学习技术。我通过网上的教程学习了如何设置,并且成功将这个功能添加到我的电脑上。其实,这个过程并不简单,因为涉及到很多配置和技术细节,但通过不断尝试和调整,我还是完成了设置。能够在自己的电脑上运行这些强大的功能。

image.png

``


# 加载模型和分词器
model_name = "Qwen/Qwen2.5-Coder-32B-Instruct"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name)

# 输入文本
input_text = "Can you tell me a joke?"

# 将输入文本转换为模型输入格式
inputs = tokenizer(input_text, return_tensors="pt")

# ---------------------------- 1. Greedy Search (贪婪搜索) ---------------------------- #
# 使用贪婪搜索,模型会选择每一步最有可能的词汇
greedy_outputs = model.generate(
    inputs['input_ids'],
    do_sample=False,  # 不使用采样,直接选择最可能的词
    max_length=100,   # 设置生成的最大长度
)
greedy_generated_text = tokenizer.decode(greedy_outputs[0], skip_special_tokens=True)
print("Greedy Search Output:")
print(greedy_generated_text)

# ---------------------------- 2. Top-k Sampling ---------------------------- #
# 使用 top-k 采样,限制生成时最多考虑 top-k 个词汇
top_k_outputs = model.generate(
    inputs['input_ids'],
    top_k=50,         # 选择考虑的词汇数目
    do_sample=True,   # 启用采样
    max_length=100,   # 设置生成的最大长度
    temperature=0.7,  # 控制随机性,0.7 表示更保守的生成
)
top_k_generated_text = tokenizer.decode(top_k_outputs[0], skip_special_tokens=True)
print("\nTop-k Sampling Output:")
print(top_k_generated_text)

# ---------------------------- 3. Top-p (Nucleus Sampling) ---------------------------- #
# 使用 nucleus sampling (top-p),控制累计概率阈值
top_p_outputs = model.generate(
    inputs['input_ids'],
    top_p=0.9,        # 限制生成时考虑的词汇的概率累计值
    do_sample=True,   # 启用采样
    max_length=100,   # 设置生成的最大长度
    temperature=0.7,  # 控制随机性
)
top_p_generated_text = tokenizer.decode(top_p_outputs[0], skip_special_tokens=True)
print("\nTop-p (Nucleus Sampling) Output:")
print(top_p_generated_text)

# ---------------------------- 4. Sampling with Repetition Penalty ---------------------------- #
# 使用 repetition penalty 防止生成重复文本
repetition_penalty_outputs = model.generate(
    inputs['input_ids'],
    repetition_penalty=1.2,  # 增加惩罚系数,避免重复生成相同内容
    do_sample=True,          # 启用采样
    max_length=100,          # 设置生成的最大长度
    temperature=0.7,         # 控制随机性
)
repetition_penalty_generated_text = tokenizer.decode(repetition_penalty_outputs[0], skip_special_tokens=True)
print("\nRepetition Penalty Output:")
print(repetition_penalty_generated_text)

# ---------------------------- 5. Generate Multiple Responses ---------------------------- #
# 生成多个回答
multiple_outputs = model.generate(
    inputs['input_ids'],
    num_return_sequences=3,  # 生成多个回答
    do_sample=True,          # 启用采样
    max_length=100,          # 设置生成的最大长度
    temperature=0.7,         # 控制随机性
)
print("\nMultiple Generated Outputs:")
for i, output in enumerate(multiple_outputs):
    generated_text = tokenizer.decode(output, skip_special_tokens=True)
    print(f"Response {i + 1}: {generated_text}")

# ---------------------------- 6. Using Different Inputs ---------------------------- #
# 尝试不同的输入文本,查看模型如何响应
input_texts = [
    "Can you tell me a joke?",
    "What is the capital of France?",
    "Explain the theory of relativity.",
    "How do I cook a perfect steak?"
]

for i, input_text in enumerate(input_texts):
    print(f"\nInput {i + 1}: {input_text}")
    inputs = tokenizer(input_text, return_tensors="pt")
    
    # 使用 top-p (nucleus sampling) 生成回答
    response = model.generate(
        inputs['input_ids'],
        top_p=0.9,          # 限制生成时考虑的词汇的累计概率
        do_sample=True,     # 启用采样
        max_length=100,     # 设置生成的最大长度
        temperature=0.7,    # 控制随机性
    )
    
    response_text = tokenizer.decode(response[0], skip_special_tokens=True)
    print(f"Generated Response: {response_text}")