一、前言 前阵子写了几篇大模型开发相关的入门的文章,然后有同学私信说自己训练或者微调出来的模型效果不如预期,对于这一点,我在前面的文章里也反复强调过多次,对于大模型来说,唯一真正有价值的只有:数据。脸书扎克伯格花大价钱ScaleAI的底层逻辑也在于此。 在现在这个时代,完全可以说,大部分的技术都是没有什么价值的,因为大部分的技术都是有手就行。真正的价值都在数据,而且最有价值的数据往往都是一个个的专业领域的数据,决定大模型微调效果的是数据,决定你整个产品成败的也是数据,这个事情一定要搞清楚。所以呢,建议大家从现在开始,给自己好好做积累吧,把你的行业数据、专业领域的数据一点点积累好,这才是你的未来。 而数据中最重要的还是实际的业务数据,并不是让大模型帮你生成的数据,但是如果你是为了做一些项目的测试的话,让大模型来帮忙丰富一下你的数据集也是一个不错的选项。这里就用我自己的一个实际的用于语音助手的案例,来手把手教你如何利用大模型来帮你生成一些数据。 【有手就行】大模型开发入门系列 二、让大模型帮忙生成训练集 之前用的更多的是利用ChatGPT来生成数据,但是为了写这篇文章,我又专门用千问、文心、豆包、ChatGPT走了一遍完整流程。这篇文章主要有用的就是生成数据的提示词,顺便用这个实例介绍对比一下几个主流模型的表现,供大家参考。 从这一轮次的的测试生成数据集的情况来看,印象分最好的要算Qwen3-Max,而ChatGPT则垫底了。看来中文还是得选中国的大模型。另外,犹记当年第一届世界人工智能大会时,马云跟马斯克吹牛:AI就是Alibaba Intelligent,这牛吹的当年所有人都想笑,再过几年看看Alibaba到底能不能笑傲江湖,让咱们座目以待。 此外,具体每个大模型生成的数据由于太大,在这里我就不列了,不过我保存到了云盘,感兴趣的可以后台私聊我:【测试集】,会自动回复下载链接,同时你也可以自行生成。 1. 千问 使用模型:Qwen3-Max 秒级响应。刺溜一下就给生成好了。而且是一步到位,不像豆包、文心那样,先生成数据,再自己写代码把数据保存到一个json文件。千问牛逼格拉斯。不过,生成的json文件在公司不能下载(在家里正常),可能跟公司网络DNS有关。 生成的文字多样性佳: 2. 百度文心一言 使用模型:文心大模型X1.1 为每个意图生成50条数据很快,但是文心一言为了将结果保存到json文件费了老大的劲,因为它是自己写代码来实现的,而它写的代码执行的报错了好多次,然后它自己一直在改它自己的代码,结果浪费了很多时间,XD 生成的文字多样性: 但是它在这个请求里自己生成的代码出问题,扣掉了我对它的印象分。 3. 豆包 使用模型:豆包上没写版本号,公有云的反正是最新的。 豆包-同文心,也是自己写代码生成json,比百度好一点,保存json的代码一次成功,没有改半天代码。生成的文字多样性也不错。槽位的准确率100%。它相比文心好的地方就是保存json的代码一次成功,没让我等半天。 生成的文字多样性: 4. ChatGPT 使用模型:普通版本(非Business版本) For quick tasks & answers 速度跟豆包差不多。思考过程在生成后不能查看,所以不清楚是跟千问一样,一步到位,还是跟豆包、文心一样,先生成数据,再写代码存文件。 生成的文字的多样性: 三、注意事项 如果你生成数据的目的是为了训练的话,建议的做法还是要用一些实际的数据,而不是找大模型来帮你生成数据,这一点很重要。但是如果你是为了学习大模型训练或者大模型微调的话,可以考虑让大模型帮你生成一些数据,但仅限于学习。毕竟,大模型生成的数据都不一定是真正你的产品、业务所需要的数据。 四、广而告之 新建了一个技术交流群,欢迎大家一起加入讨论。扫码加入AI技术交流群(微信)关注我的公众号:奥德元让我们一起学习人工智能,一起追赶这个时代。
LLM
一、前言 1. 本文目标 你有没有问过大模型“你是谁”?问了的话,拿到的答案清一色都是大模型厂商的名字。而如果你自己部署了一个模型的话,通常都希望有人在你的应用里问你是谁的时候能给出一个“你的答案”。这篇文章就是干这个事情的,20分钟让大模型的名字变成你自己的名字。 2. 大模型入门系列介绍 前阵子介绍了两个【有手就行】的大模型基础知识,今天是大模型开发【有手就行】的第三篇。 前两部在这里: 这个是入门三步曲最后一步:MS-SWIFT认知微调,把大模型的名字改成你的名字。 上手学习大模型、人工智能相关的开发并没有什么太过高深的门槛,真的很简单,真的就是【有手就行】。 二、SWIFT认知微调相关的一些废话 1. 什么是ms-swift ms-swift(全称 Scalable lightWeight Infrastructure for Fine‑Tuning)是阿里的魔搭社区(ModelScope) 推出的一个大模型全流程工程化框架,是 “大模型轻量微调与部署的基础设施”,在消费级 GPU 与国产硬件也都可用,我有在4090,PPU平头哥、Ascend昇腾上都用过。 2. 为什么要做ms-swift微调 就像之前讲的那样:自己从头开始训练一个基座大模型是不现实的,只能以学习目的来了解大模型是如何训练出来的,有哪些步骤,会有一些什么样的训练参数、每个参数的意义和影响是什么等。所以大家更多会涉及的是利用一些现有的开源大模型来做微调,用自己的个人数据、行业数据来微调训练大模型,然后让这个大模型变成你自己的私人大模型或者行业大模型。可惜我自己觉得最重要的LoRA微调的那篇文章反而看的人比较少(一如既往的不太懂,呵呵),可能是我取的标题不够“标题党”(求大佬们指教),也可能跟公众号推荐规则有关。而一旦你自己微调训练了一个大模型,那随后必做的一件事情就是把这个大模型的名字变成你自己,当有人问它:“你是谁?”的时候,它回答的应该是:它是xxx(你给它取的名字),是由yyy(你的名字)开发出来的。比如: 我是小落,是由落鹤生开发的个人智能助手。我主要的目的是通过记录落鹤生每天的日常工作、生活的点点滴滴,然后希望在数据足够的某一天,我可以成为一个数字复刻版本的落鹤生。如果您对小落同学有任何疑问或需要帮助,请随时提出,我会尽力为您解答。 三、开始 ms-swift支持 600 多个纯文本大型模型和 300 多个多模态大型模型的训练。为方便同学们复现,我以 Qwen3-4B-Instruct模型为例 ,从模型下载开始介绍整个流程。如果有问题可以直接在下面留言,或者加一下AI技术学习交流群一起讨论。 1. 模型下载 从modelscope下载需要的模型(huggingface不太稳定,当然也可以用镜像站:https://hf-mirror.com ) 2. 原始模型部署 原则上,你的服务器上有多少GPU就都给你用上先。 3. 原始模型测试 4. 微调Qwen3-4B-Instruct-2507模型 这里在我原先的OddAgent项目基础上训练一个会议语音指令助手。这里使用官方的示例对Qwen3-4B-Instruct-2507模型进行自我认知微调。 1)安装ms-swift框架 pip 源码方式 […]
一、说在前面 训练基座大模型那都是大公司们的事情,普通人、普通公司肯定是玩不起的,但是作为一个技术人,你可以不去做真正的大模型训练,但是你还是有必要知道和了解一下一个大模型是如何训练出来的。 而GPT_teacher-3.37M-cn 是一个很好的示例项目,让你可以用一台普通的PC,用CPU来训练一个3.37M的中文GPT模型,整个训练耗时不到20分钟,回答训练集里的问题的效果也还是挺不错的。感兴趣的同学可以用这个项目来练手、实操复现一下“自己动手从0开始训练一个大模型”的完整流程。 二、项目概述 一个轻量级中文GPT模型项目,专为在CPU上快速训练和演示而设计: 模型参数量:3.37M架构:4层Transformer解码器特点:使用RMSNorm、RoPE位置编码、权重共享等优化技术目标:45分钟内在普通CPU上训练出可用的中文问答模型 参考训练时长: 三、完整复现流程 介绍完了,就让我们来实操整个从0到1的训练吧。 先下载代码: 1. 环境准备 依赖项包括: 2. 构建中文分词器 这将: 3. 配置文件确认 config.yaml包含了所有必要配置,我在这里给每个参数加了个说明,以便于理解每个参数的意义。 4. 执行训练 5. 测试模型 训练完成后,根据src/train.py中的代码,最终会在config.yaml指定的目录下(checkpoints)生成一个标准的模型,以及一个量化的模型,分别是: 然后你可以用下面的命令来测试一下训练集(位于data/train.jsonl)里的一些问题: 四、关键技术点解析 在这个示例的大模型训练里,我们基于Decoder-only的Transformer(因果语言模型),使用下三角掩码确保每次只关注历史信息,这正是GPT系列模型能够生成连贯文本的核心。 1. 训练参数说明 具体的训练参数我在上面的config.yaml里给每个参数都写了一个注释,用于说明每个参数的意义。而总结概括一下这个配置参数的话,主要如下: 2. 关键代码 五、补充说明 1. 仅3.37M参数远达不到scale law 这个项目只是一个演示项目,教你如何自己动手从0到1来训练一个大模型,但是必须要知道的是大模型有个别称是 scale law,所以走传统transfomer路线的话,注意力是非常吃参数的,这么一个参数量,其输出完全肯定不会非常好(除非你问的就是训练集里的知识)。同时在这个项目的训练集(位于data/train.jsonl)里你也可以看到,虽然有510条训练数据,但实际上里面的内容全是Ctrl C + Ctrl V出来的,真正的prompt和completion就几条。 2. 为什么问一些不在训练集里的问题时,返回乱七八糟的东西,而不是“不知道” 大模型的本质是一个词语接龙游戏,每出一个字,根据概率去预测下一个字是什么。其目标是生成流畅的文本,而不是正确的文本,它只是在模仿训练集里的文本概率,而不是真正的理解内容,所以最终的效果完全取决于你给它的训练数据。因此,当你去问不在训练集里的问题的时候,大模型就只能随便的去猜下一个字可能是什么字,而不是直接给你回答一个“不知道”,这也是大模型“幻觉”的由来。 3. 关于大模型幻觉 大模型幻觉主要有四种幻觉类型:前后矛盾,提示词误解,事实性幻觉,逻辑错误。幻觉主要有三大成因:数据质量问题,生成机制缺陷,模糊指令。幻觉通常有五种解决方案:精准提示词、示例学习、调参、RAG技术、幻觉检测方案,并让大模型学会给答案标注“参考文献”(溯源)。 […]
一、省流,直接看结论 一)参数:两个4090,1000 token的输入,128 token的输出(vllm benchmark默认值) 1. benchmark最高并发请求:60+ 参数:两个4090,1000 token的输入,128 token的输出(vllm benchmark默认值) 2.启用FlashInfer前后对比 启用FlashInfer比默认的PyTorch-native模式的性能提升差不多。 client端统计对比 server端统计对比 用pyplot针对这3次测试跑的3个日志文件生成了一个图。 3.结论 测试1000个请求, 三轮跑下来, 不启用flashinfer总耗时稍长一点点(差10来秒, 459 vs 449).启用flashinfer: 并发请求可达到60左右,但是受限于硬件/GPU, 首字出字速度, 单位输出token时延等数据都会延长。每秒输出的总token数1=125604/448.73=27.99 tps每秒输出的总token数2=125600/449.52=27.32 tps不启用flashinfer: 并发请求在40左右, 但首字出字速度, 单位输出 token时延都会较短.每秒输出的总token数=125604/459.73=27.32 tps 关于flashinfer:从测试结果来看,启用后并没有将这1000个请求的总耗时降下来多少,因此最终还是会受限于硬件/GPU? 二)参数:两个4090,1000 token的输入,1000 token的输出(会议摘要常规输出) 1.benchmark最高并发请求:约40~50左右 2.启用FlashInfer后数据 合并到上面的表格,具体看FlashInfer3一列数据 3.结论 指定输出token数量从128到1000,对最大并发有影响,全影响不是非常大。每秒输出的总token数=967760/1423.79=67.9 tps。这一段测试是在5点后,快下班时间跑的 二、测试硬件环境 •软件环境:PyTorch 2.6.0、Python 3.12(ubuntu22.04)、Cuda 12.4•硬件环境:○GPU:RTX 4090(24GB) * […]
一、导言 ***牵头组织了一个会议,对Deepseek在视讯方案的可能性进行了一番讨论,讨论后的结论是对Deepseek先做一番技术上的预研,然后再上产品路标。后来**和**也针对此事做了一些交待。再后来就是撸起袖子了。 二、预研目标 《Deepseek在视讯方案的可能性》:一句话表示:在消费级的GPU上跑满血版Deepseek R11、GPU:结合公司的实际情况(还躺在米国政府的黑名单上),预研所针对的硬件必须是我们有可能买得到的硬件。2、Deepseek R1满血版:预研初期确定的目标是满血版Deepseek R1 671B(实际测下来发现可能存在一些问题) 三、预研情况说明 在曾哥租到GPU服务器之后,有了硬件资源后,主要利用这个GPU服务器做了以下几部分预研。一是包括Deepseek/QwQ32-B/Gemma3等等在内的大模型安装、部署与测试。二是有了大模型之后,视讯这边可能的一些应用,包括:Chat API, Agent等。三是与KIS做了一些集成测试。四是视讯智能产品KIS相关的一些周边技术,包括:ASR, TTS等。 一)预研设定的环境 1. 软件环境 PyTorch 2.5.1Python 3.12(ubuntu22.04)Cuda 12.4 2. 硬件环境 ○GPU:RTX 4090(24GB) * 2○CPU:64 vCPU Intel(R) Xeon(R) Gold 6430○内存:480G(至少需要382G)○硬盘:1.8T(实际使用需要380G左右) 参考:京东上GPU 4090 x2+CPU 6330 +内存64G+硬盘2T报价约为:69500。https://item.jd.com/10106874216614.html 二)大模型测试 直接上结论。 测试结果 大模型 框架 max_new_tokens context GPU数量 TPS(单连接) TPS(多连接) ds-r1-671b Q4 KT 8192 […]
一、说在前面 今天有一个朋友在一个群里提到了N年前经常用的一个软件:UC浏览器,一个子勾起了当年无数的回忆。于是又让我想起来今年过年、在家里无聊时安装的这个最低配的Deepseek版本。晚上在家无的事事,那就把我当初安装时写的笔记稍作整理,放出来跟大家分享一下。 特别说明:这个百无禁忌版本的Deepseek是为了让大家能体验到原汁原味的大模型的输出,不是让你去做坏事的哈,并且这个东西只可自己学习时用,不可对外提供接口,因为这是违反国家政策的。不过另外一句话来讲,事实上有许多东西都是:我可能一辈子都不会去用,但是我不能没有它(卖保险的同学听到这句话,一下子泪目,您说的太对了,明天咱们聊聊?)。 安装要求:1、操作系统:据说Windows Family版本会有一些问题,但是我没试过。不太清楚什么情况。当然,如果是Linux操作系统,那只要你更新到新一点的版本,随便哪个发行版都不会有问题。2、硬盘要求: 版本 内存 CPU 显卡 适用场景 1.5B 8GB+ i5/Ryzen 5 集成显卡或低端独显 基础对话、简单文本生成 7B/8B 16GB+(建议24GB) i7/Ryzen 7 RTX 3060及以上 通用对话、代码生成 14B 32GB+ i9/Ryzen 9 RTX 3080/4070 长文本推理、专业应用 32B 64GB+ 高性能多核服务器 双卡专业级GPU 科研计算、复杂检索 70B 128GB+ 服务器级多核系统 多卡GPU集群 企业级私有化部署 看完这些要求后,如果你的电脑满足要求,那你可以考虑继续往下看,如果不满足要求,那就不要浪费你自己的时间了。 以下是我的8年前配的笔记本配置,我选择的模型是8B,但是出字速度不太行。 二、安装Ollama 官网下载频道:https://ollama.com/download ,不过实际的下载地址还是指向了github,所以不能科学上网的同学那下载的会比较郁闷,因为整个包有1G左右。当然也可以找度娘的网盘。 下载下来后,就直接默认安装即可。 安装完了会自动跳出来一个命令行,在那里敲一个: 如果返回一个版本号,那么恭喜你,安装成功! 但是,如果你跟我一样,是晚上睡觉前开的下载,然后下载完了自动关电脑的。那么你在重新开机后,可以用管理员的身份打开一个命令行,然后在那里再敲: ollama -v […]
关于BF8 DeepSeek R1和DeepSeek V3都是默认BF8精度,是一种低精度的浮点数格式。BF8的全称是”Brain Floating Point”,由Google提出,主要用于大规模计算任务。与常见的16位浮点数(FP16)不同,BF8采用了8位尾数和8位指数的结构,能够在保证精度的同时减少计算和内存开销。 BF8的设计目标是减少计算量并保持数值稳定性,特别是在机器学习模型训练中,能在加速硬件上提供比FP32更好的性能。 硬件选择 采用“强推理、弱训练”的硬件配置:如选择国产芯片、或者采购DeepSeek一体机、甚至是选择MacMini集群等,都是不错的选择。这些硬件模型训练性能较弱,但推理能力强悍,对于一些不需要进行模型训练和微调、只需要推理(也就是对话)的场景来说,是个非常不错的选择。例如45万左右成本,就能购买能运行DeepSeek R1满血版模型的Mac Mini集群,相比购买英伟达显卡,能够节省很大一部分成本。但劣势在于Mac M系列芯片并不适合进行模型训练和微调。 蒸馏模型 采用DeepSeek R1 Distill蒸馏模型:DeepSeek R蒸馏模型组同样推理性能不俗,且蒸馏模型尺寸在1.5B到70B之间,可以适配于任何硬件环境和各类不同的使用需求。 采用KTransformers •KTransformers主页: https://github.com/kvcache-ai/ktransformers采用KTransformers(Quick Transformers)技术:这是一项由清华大学团队提出的,可以在模型运行过程中灵活的将专家模型加载到CPU上,同时将MLA/KVCache卸载到GPU上,从而深度挖掘硬件性能,实现更低的显存运行更大尺寸的模型。该技术目前的实践效果,可以实现480G内存+13G显存(长尺寸输出或多并发时达到20G显存),即可运行DeepSeek R1 Q_4_K_M量化版模型(类似INT4量化),并且响应速度能够达到15token/s。 传统情况下,8卡 A100 GPU服务器才能运行DeepSeek R1 INT4模型,成本接近200万。而480G内存+单卡4090服务器,总成本不到5万。 采用Unsloth动态量化 •Unsloth主页:https://unsloth.ai/采用Unsloth动态量化技术:不同于KT将不同的专家加载到CPU上,通过内存分担显存的方法保证R1 Q4KM模型运行。技术方案是在确保模型性能的基础上,更深度的进行模型量化(最多量化到1.58Bit),并且执行不同任务时将激活的专家加载到GPU上,从而压缩模型运行所需硬件条件。该技术能够实现单卡24G显存运行1.58bit到2.51bit的DeepSeek R1模型,并且提供了一整套动态方案,支持从单卡24G到双卡80G服务器运行动态量化的R1模型,并且对于内存和CPU没有任何要求。通常意义下量化程度越深,模型效果越差,但由于Unsloth出色的技术能力,导致哪怕是1.58bit量化情况下,量化模型仍能拥有大部分原版模型的能力。 CPU AMX指令 CPU AMX(Advanced Matrix Extensions)是Intel在其Sapphire Rapids系列处理器中推出的一种新型硬件加速指令集,旨在提升矩阵运算的性能,尤其是针对深度学习和人工智能应用。
[TOC] 由于模型、权重文件已经下载好了,所以跳过这些步骤。open-webui也在昨天已经安装好,同样跳过。无废话流程 硬件环境 租的AutoDL的GPU服务器做的测试•软件环境PyTorch 2.5.1、Python 3.12(ubuntu22.04)、Cuda 12.4•硬件环境○GPU:RTX 4090(24GB) * 4(实际只使用一张GPU)○CPU:64 vCPU Intel(R) Xeon(R) Gold 6430○内存:480G(至少需要382G)○硬盘:1.8T(实际使用需要380G左右) 一、创建环境 创建虚拟环境 安装 PyTorch、packaging、ninja 安装flash-attn 安装libstdcxx-ng 二、编译安装ktransformers 修改./install.sh,加入: export MAX_JOBS=64export CMAKE_BUILD_PARALLEL_LEVEL=64 三、运行 运行ktransformer 启动命令行聊天 启动本地聊天API端点 运行open-webui 建立 ssh转发 等服务器上webui和api端点都起来后,在本地PC上,建一个ssh转发规则 打开浏览器进行测试 http://localhost:3000 四、参数调整 将cpu_info降低,观察tps变化 直接上结论,数据看后面: cpu_info = 64 PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True python3 ktransformers/server/main.py –gguf_path /root/autodl-tmp/DeepSeek-R1-GGUF/ –model_path /root/autodl-tmp/DeepSeek-R1 –model_name […]
[TOC] Ktransformer+Deepseek R1 671B实操 一、测试目标 验证并确认Ktransformer+Deepseek R1 671B的效果是否能满足公司的需求,并得出最终的硬件要求,以最终自行购置一台服务器来跑Deepseek R1 671B. 二、目标硬件要求 根据网上的测评,拿到一个硬件要求如下:•软件环境:PyTorch 2.5.1、Python 3.12(ubuntu22.04)、Cuda 12.4•硬件环境:○GPU:RTX 4090(24GB) * 4(实际只使用一张GPU)○CPU:64 vCPU Intel(R) Xeon(R) Gold 6430○内存:480G(至少需要382G)○硬盘:1.8T(实际使用需要380G左右) 三、GPU服务器租用-选AutoDL 阿里云、腾讯云、百度云、华为云这些都有GPU服务器,但是他们的GPU都是企业级的GPU,而我们最终的目标是自建,所以只能选消费级的GPU来测试。因此首选AutoDL,但是他的服务器白天基本上一直忙,早上一大早就需要去抢才能抢到,单台服务器的内存最高120,购置4台可满足要求,其中一台硬盘要可扩到至少600G。 四、服务器环境 python版本 返回Python 3.12.3 CUDA版本 返回nvcc: NVIDIA (R) Cuda compiler driverCopyright (c) 2005-2023 NVIDIA CorporationBuilt on Mon_Apr__3_17:16:06_PDT_2023Cuda compilation tools, release 12.1, V12.1.105Build cuda_12.1.r12.1/compiler.32688072_0 torch版本 返回2.6.0+cu124 […]
1. 春考情况 春考结束了,希望是春考后不用再看英语了,但是这次春考的题目感觉比之前做过的每一个模拟卷都难,尤其是星期一的听力,上午和下午两套题差异明显,众多同学都普遍认为下午的比较简单,都是之前练习时涉及比较广泛的,而上午的则是一些新的、之前未涉及的一些内容,我参加的是上午的,心理有一些忐忑。但我知道这个时候我应该放下,不管怎么样,考完了就是考完了,一切等1月21日见分晓。 今天把聊天机器人在老爸的指导下,照着教程改了一下,主要学习的是django框架下的一些数据库操作,修改涉及内容: 2. 学习笔记 为后端加了数据库 共三个model1)agent model (希望可以做成多个智能体)2)session model(会话模型)3)message model(聊天消息模型) 照着文心一言给生成的数据库,并生成了这三个model的代码。然后再:1)python manage.py makemigrations 生成迁移文件2)python manage.py migrate 更新到数据库 并学习和了解了在用户认证中的token, 聊天中的session等等一些概念、名词及意义。token: 用户登录到后端后,后端会为这个用户生成一个独一无二的字符串,来代表这个用户,登录成功拿到这个token后,前端再与后端做交互的话,可以用这个token代表他自己,不需要每个交互请求都认证一遍。session: 这个比较了理解,在所有的大模型里都是这么一个用法,不展开了。 记录保存数据库 照着https://docs.djangoproject.com/zh-hans/5.1/ 介绍,尝试理解django里的model,view的概念。然后将我和智能体之间的聊天记录可以保存到创建的这个数据库,其中有几个点是需要注意的: 后端的信息传递到前端 有些数据是存储在后端的,前端一开始没有,所以第一次交互的时候都是空值,比如像上面那些user_id, session_id, agent_id,第一次请求到后端后,我们可以在后端生成或者获取到这些信息,而我们在拿到大模型的答复后,在响应里可以把这些信息一并带回前端,那样后面前端就有了所有这些信息,后续的交互里内容就完整了。 前端如何接收来自后端的数据 好多种方法,先练习一个,具体看代码。 一边问文心一言,一边改,改了好久,文心一言给了好多代码,但是许多代码跟前面的代码不搭,跑不起来,或者跑起来有问题。从中午12点到晚上18点,今天花的时间有点多了,不过总算把功能都走通了,开心。晚一点递交代码到github。