CPU即可训练的大模型复现GPT_teacher-3.37M全过程

https://gitee.com/baidumap/GPT_teacher-3.37Mhttps://gitee.com/baidumap/

复现使用python3.9.12版本进行复现,或者使用anaconda环境

整个项目已经打包

保存链接: https://pan.baidu.com/s/1NnzG5qyS9ouu-U7D1YvkOg?pwd=cccc

1. 安装缺失的依赖

在你的终端执行:

pip install -r requirements.txt

复制代码
pip install tokenizers pyyaml

注:由于项目中有 config.yaml,通常还需要 pyyaml 库来读取配置。


2. 重新执行"三步走"流程

安装好依赖后,请严格按照以下顺序执行,这是让模型"开口说话"的必经之路:

第一步:构建分词器

Bash

复制代码
python -m src.build_tokenizer

检查点 :执行完后,你的文件夹里应该会出现一个 tokenizer 目录,里面包含 tokenizer.json

第二步:简短训练(生成权重)

因为你手里没有 last.pt,需要让 CPU 跑一下训练流程来创建这个文件:

Bash

复制代码
python -m src.train
  • 操作技巧 :你不需要真的等它跑 20 分钟。当看到终端开始打印 step 100step 200 并且显示 saved checkpoint 时,直接按 Ctrl + C 停止它。此时 checkpoints/last.pt 就已经躺在你的文件夹里了。
第三步:启动 GUI 聊天

现在,再次运行我之前为你写的脚本:

Bash

复制代码
python gui_chat.py

gui_chat代码

复制代码
import tkinter as tk
from tkinter import scrolledtext, messagebox
import torch
import threading
import os

# 导入项目中已有的逻辑
from src.model import GPT
from src.tokenizer import load_tokenizer
from src.infer import load_checkpoint, generate

class GPTChatGUI:
    def __init__(self, root):
        self.root = root
        self.root.title("GPT Teacher 3.37M - 极简聊天窗")
        self.root.geometry("500x650")
        self.root.configure(bg="#f5f5f5") # 浅灰色背景

        # 1. 加载模型资产
        self.load_model_assets()

        # 2. 界面布局
        self.create_widgets()
        
        # 3. 打印欢迎语
        self.append_message("AI", "你好!我是 GPT Teacher。我已经准备好回答你的问题了。")

    def load_model_assets(self):
        # 优先查找量化权重,如果没有则找普通权重
        ckpt_path = "checkpoints/quantized.pt" if os.path.exists("checkpoints/quantized.pt") else "checkpoints/last.pt"
        
        if not os.path.exists(ckpt_path):
            messagebox.showerror("错误", f"未找到模型权重文件!\n请确保已运行训练并生成 {ckpt_path}")
            self.root.destroy()
            return

        try:
            obj = load_checkpoint(ckpt_path)
            cfg = obj["cfg"]
            self.tok = load_tokenizer(cfg.get("tokenizer", {}).get("type", "byte"),
                                      cfg.get("tokenizer", {}).get("path"))

            self.model = GPT(
                vocab_size=self.tok.vocab_size,
                n_layer=cfg["model"]["n_layer"],
                n_head=cfg["model"]["n_head"],
                n_embd=cfg["model"]["n_embd"],
                seq_len=cfg["model"]["seq_len"],
                dropout=cfg["model"]["dropout"],
            )

            sd = obj["model"]
            if any("_packed_params" in k for k in sd.keys()):
                self.model = torch.quantization.quantize_dynamic(self.model, {torch.nn.Linear}, dtype=torch.qint8)

            self.model.load_state_dict(sd)
            self.model.eval()
        except Exception as e:
            messagebox.showerror("加载失败", f"模型初始化失败: {str(e)}")
            self.root.destroy()

    def create_widgets(self):
        # --- 聊天记录显示区 ---
        self.chat_display = scrolledtext.ScrolledText(
            self.root, wrap=tk.WORD, state='disabled',
            font=("Microsoft YaHei", 10),
            bg="#f5f5f5", relief=tk.FLAT, padx=10, pady=10
        )
        self.chat_display.pack(padx=10, pady=10, fill=tk.BOTH, expand=True)

        # 定义样式标签
        self.chat_display.tag_config("user", foreground="#005a9e", font=("Microsoft YaHei", 10, "bold"))
        self.chat_display.tag_config("ai", foreground="#2e7d32", font=("Microsoft YaHei", 10, "bold"))
        self.chat_display.tag_config("text", lmargin1=20, lmargin2=20, foreground="#333333")
        self.chat_display.tag_config("sep", spacing1=10) # 间距

        # --- 输入区 ---
        input_container = tk.Frame(self.root, bg="white", height=60)
        input_container.pack(fill=tk.X, side=tk.BOTTOM, padx=10, pady=10)

        self.user_input = tk.Entry(
            input_container, font=("Microsoft YaHei", 11),
            relief=tk.FLAT, bd=0
        )
        self.user_input.pack(side=tk.LEFT, fill=tk.BOTH, expand=True, padx=10, ipady=10)
        self.user_input.bind("<Return>", lambda e: self.send_message())
        self.user_input.focus_set()

        self.send_btn = tk.Button(
            input_container, text="发送", command=self.send_message,
            bg="#0078d4", fg="white", relief=tk.FLAT,
            font=("Microsoft YaHei", 10, "bold"), width=8
        )
        self.send_btn.pack(side=tk.RIGHT, fill=tk.BOTH)

    def append_message(self, role, text):
        self.chat_display.config(state='normal')
        
        if role == "User":
            self.chat_display.insert(tk.END, "● 你\n", "user")
            self.chat_display.insert(tk.END, f"{text}\n", ("text", "sep"))
        else:
            self.chat_display.insert(tk.END, "● GPT Teacher\n", "ai")
            self.chat_display.insert(tk.END, f"{text}\n", ("text", "sep"))
            
        self.chat_display.config(state='disabled')
        self.chat_display.see(tk.END)

    def send_message(self):
        prompt = self.user_input.get().strip()
        if not prompt:
            return

        self.append_message("User", prompt)
        self.user_input.delete(0, tk.END)

        # 禁用发送按钮,防止连续点击
        self.send_btn.config(state=tk.DISABLED)
        threading.Thread(target=self.run_inference, args=(prompt,), daemon=True).start()

    def run_inference(self, prompt):
        try:
            # 使用项目推荐的推理设置
            response = generate(
                self.model, self.tok, prompt,
                max_new_tokens=128, # 稍微长一点
                temperature=0.0,    # 教学模型建议 0.0 最稳定
                stop_strings=["。", "!", "?", "\n", "用户:"]
            )
            # 格式化一下响应文本
            response = response.strip()
            if not response: response = "(模型没有给出具体回答)"
            
            self.root.after(0, self.update_ui_after_run, response)
        except Exception as e:
            self.root.after(0, self.update_ui_after_run, f"发生错误: {str(e)}")

    def update_ui_after_run(self, response):
        self.append_message("AI", response)
        self.send_btn.config(state=tk.NORMAL)

if __name__ == "__main__":
    root = tk.Tk()
    # 尝试设置图标(如果有的话)
    app = GPTChatGUI(root)
    root.mainloop()

现在正在训练了

我想在训练和验证的时候就推理,那么就不能说以问题来推理答案,直接以问题来推理会导致推理很久都不能得到答案。

那么应该是要以它学到的东西来推理。

这个模型训练好后只能问相关的问题

什么是注意力机制?

由于数据集太小,只能达到这个程度。

数据集就这么大,所以实际它学到的就是大概的概率。

问题大概是什么,它就回答什么

相关推荐
acai_polo1 天前
如何在国内合规、稳定地使用GPT/Claude/Gemini API?中转服务全解析
人工智能·gpt·ai·语言模型·ai作画
迈火2 天前
SD - Latent - Interposer:解锁Stable Diffusion潜在空间的创意工具
人工智能·gpt·计算机视觉·stable diffusion·aigc·语音识别·midjourney
空中楼阁,梦幻泡影2 天前
主流4 大模型(GPT、LLaMA、DeepSeek、QWE)的训练与推理算力估算实例详细数据
人工智能·gpt·llama
晓晓不觉早3 天前
OpenAI Codex App的推出:多代理工作流的新时代
人工智能·gpt
kebijuelun3 天前
Towards Automated Kernel Generation in the Era of LLMs:LLM 时代的自动化 Kernel 生成全景图
人工智能·gpt·深度学习·语言模型
卖芒果的潇洒农民5 天前
20260201 GPT VPC中的CIDR Block 概念
笔记·gpt
薛定谔的猫19825 天前
二十、使用PyTorch和Hugging Face Transformers训练中文GPT-2模型的技术实践
人工智能·pytorch·gpt
向量引擎小橙8 天前
Google 帝国的绝地反击:Gemini 3 深度硬核测评——GPT-5 的噩梦来了吗?
开发语言·人工智能·gpt·深度学习·机器学习
原来是你~呀~8 天前
Kali GPT - 人工智能渗透测试助手Linux部署
linux·人工智能·gpt·网络安全·自动化渗透测试
康康的AI博客8 天前
2026 OpenAI技术全景:GPT-5.2领衔的AI革命与DMXAPI无缝替代方案
人工智能·gpt