前言

本文档旨在为读者提供一个关于操作系统深入理解的指南,并在导学阶段提供必要的知识清单。但注意,相较于一个纯粹的教程,你更应该把本文档看作一个知识清单。

同时,本书更新较慢但较为详细,如果想看最新版的实时文档,请去到项目主页。当前更新日期:2025-01-31。

最近一次大更新内容

本书大纲

  • 第一章:介绍了开发环境配置时可以参考的步骤与教程,本章结束,希望读者能够完成开发环境的配置。
  • 第二章:详细介绍导学阶段的一些基本信息和教学系统的使用方式。
  • 第三章:简单介绍基本 Git 命令的使用,以及初步介绍“流水线(CI)”。
  • 第四章:包含在开源操作系统训练营项目 8 授课过程中的一些偏基础的知识,以及跑起来 InfiniLM 的方法。
  • 第五章:包含对exam-grading的使用的介绍,它不需要在导学阶段一定完成,但后续阶段会使用它,所以推荐各位同学也完成一下。
  • Q&A:包含了一些常见问题的解答
  • 附录 A:汇总了可供参考的各种资料,为读者提供了进一步学习和研究的方向。
  • 附录 B:汇总了经过我们测试的,确保可以运行起来 InfiniLM 与示例模型的硬件设备,理论上来说,只要你的设备性能超过了我们测试的设备,那么你的设备应该也可以运行起来导学阶段的项目。

读者的任务

在导学阶段,目前只希望读者配置 Rust 开发环境、了解后续阶段的流程、最终要跑起来示例模型,体验自己的本地大模型。当然,如果你想要尝试其它模型,也是极好的。我们鼓励读者做出自己的尝试,并将自己的经验进行分享。

我们鼓励读者在阅读本书的同时,积极思考并尝试解决遇到的问题,通过不断的学习和实践,逐步提高自己的能力。希望本书能够成为读者导学阶段学习道路上的良师益友。

反馈与贡献

如果您有任何意见、建议或疑问,欢迎随时通过 GitHub 上的 Issues 页面进行反馈。

介绍

InfiniTensor:人工智能编译器与大模型系统训练营

InfiniTensor:人工智能编译器与大模型系统训练营由清华大学发起,面向开源社区和高校,普及人工智能各方面知识和技术,培养相关人才。训练营全程免费,通过课程、习题和项目实践,在人工智能飞速发展的背景下,为学员提供一窥深层技术的机会。

文档概述

本文档基于导学阶段的课程内容,为您提供一份较为简单易用的学习指南。但请注意,您可以将本文档看作您在 人工智能编译器与大模型系统训练营导学阶段 的一份知识地图,而不是一份完整详细的教程。我们会简要介绍所需要的知识点,但不会过于详细深入。如果有兴趣,可以自行去深入了解对应方向。

第一章:环境配置

本章概述

本章旨在帮助读者搭建 Git 环境和 Rust 开发环境,为后续的 Rust 编程学习做基本的准备。Rust 作为一门现在备受关注的系统级编程语言,其高效、内存安全的特性使其成为现在的系统级软件开发中的热门选择。本章将分三小节详细介绍如何在不同的操作系统(Windows、Linux)上安装 Git 和 Rust 环境,确保读者能够在基础阶段顺利开始 Rust 编程。

  • 第一节:Git 环境

    本节将引导读者安装 Git,Git 是一款分布式版本控制系统,广泛用于软件开发中的代码版本管理。这一部分,在网上有相当多的教程,故本节只给出教程链接,具体配置请读者自行参考。

  • 第二节:Windows 下的 Rust 环境

    本节将介绍在 Windows 操作系统上,使用 VS Code 安装 Rust 环境的步骤。由于 Windows 系统与 Linux 在文件系统和命令行界面上存在差异,因此为了方便各位同学入门,本节采用 VS Code 进行安装,确保读者能够在 Windows 上顺利运行 Rust 程序。

  • 第三节:Linux 下的 Rust 环境

    对于内核开发等工作,一般都在 Linux 环境下进行。故,如果你想要进行内核开发,则需要配置 Linux 下的 Rust 环境。本节将提供在 Linux 系统上安装 Rust 环境的指导。

    通过本章的学习,希望同学们能够掌握在不同操作系统上安装 Git 和 Rust 环境的方法,并自行配置好自己喜欢的开发环境,为后续深入学习 Rust 语言打下基础。

本章目录

Git 环境

本节目录

配置 Git

在后续阶段,你的最终成绩需要提交到远程 Git 仓库进行评测,你需要确保本地拥有 Git。

Ubuntu/Debian 发行版安装 Git:

sudo apt install git

Arch 发行版安装 Git:

sudo pacman -Syu git

Windows 下需要安装 Git for Windows,可从此链接安装。

在完成 Git 的安装后需要对 Git 进行基本的配置:

git config --global user.name "你的 git 账户名/自定义"
git config --global user.email "你的 git 账户默认的邮箱地址/常用邮箱地址"

可供参考的其它教程

完成标志

通过 git --version 命令可以检查 Git 是否安装成功。

windows 下的 Rust 环境

本节目录

参考教程

请按照Windows 下 Rust 开发环境搭建进行配置,官方文档上写的很详细。

NOTICE Windows 用户推荐采用原生 Windows 环境开发 Rust 项目。

NOTICE Rust 工具链依赖 Visual Studio 作为基础,下述简单步骤假设用户已经准备好 Visual Studio 或 Microsoft C++ 生成工具。

如图所示,下载并运行安装程序。

Download Installer

Just press enter!

Install Rust

VS Code 插件

在 Windows 下,比较推荐使用 VS Code 进行 Rust 开发,如果我没记错,在 VS-Code 里面直接装“rust-anaylzer”这个插件就行了,不用做其它麻烦的操作。

特殊说明

在下载 rust 工具时,注意 rustc 版本号,至少 rust version 1.79.0 (129f3b996 2024-06-10)

WSL 支持

NOTICE 仅针对已有配置好的 WSL2 且不方便在原生 Windows 环境开发的情况,因此配置 WSL2 的步骤不再介绍。

NOTICE Windows 用户首选原生 Windows 环境,其次 WSL2,不推荐使用第三方虚拟机软件。

第三方虚拟机软件(如 VMware)在使用 GPU 加速项目的运行时,免费版的疑似完全不支持 GPU 映射,这导致你的计算机内明明有 GPU,但在虚拟机中看不到 GPU,只能使用 CPU 进行计算,这会导致你的项目在模型参数量较大时,运行速度非常慢,因此不推荐使用。

在 WSL2 Bash 中使用此命令安装 Rust(Just press enter!):

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

linux 下的 Rust 环境

注:本节内容转载自rCore-Tutorial-Book 第三版

本节目录

环境配置

首先安装 Rust 版本管理器 rustup 和 Rust 包管理器 cargo,这里我们用官方的安装脚本来安装:

curl https://sh.rustup.rs -sSf | sh

如果通过官方的脚本下载失败了,可以在浏览器的地址栏中输入 https://sh.rustup.rs 来下载脚本,在本地运行即可。

如果官方的脚本在运行时出现了网络速度较慢的问题,可选地可以通过修改 rustup 的镜像地址(修改为中国科学技术大学的镜像服务器)来加速:

export RUSTUP_DIST_SERVER=https://mirrors.ustc.edu.cn/rust-static
export RUSTUP_UPDATE_ROOT=https://mirrors.ustc.edu.cn/rust-static/rustup
curl https://sh.rustup.rs -sSf | sh

或者使用 tuna 源来加速 参见 rustup 帮助:

export RUSTUP_DIST_SERVER=https://mirrors.tuna.edu.cn/rustup
export RUSTUP_UPDATE_ROOT=https://mirrors.tuna.edu.cn/rustup/rustup
curl https://sh.rustup.rs -sSf | sh

或者也可以通过在运行前设置命令行中的科学上网代理来实现:

# e.g. Shadowsocks 代理,请根据自身配置灵活调整下面的链接
export https_proxy=http://127.0.0.1:1080
export http_proxy=http://127.0.0.1:1080
export ftp_proxy=http://127.0.0.1:1080

安装完成后,我们可以重新打开一个终端来让之前设置的环境变量生效。我们也可以手动将环境变量设置应用到当前终端,只需要输入以下命令:

source $HOME/.cargo/env

接下来,我们可以确认一下我们正确安装了 Rust 工具链:

rustc --version

可以看到当前安装的工具链的版本。

rustc 1.62.0-nightly (1f7fb6413 2022-04-10)

特殊说明

以下非转载:

注:在我们的导学阶段,工具链版本至少为:rust version 1.79.0 (129f3b996 2024-06-10)

如果曾经下载过 Rust, 可以通过以下命令来更新:

rustup update

第二章:导学阶段基本信息

本章概述

本章主要介绍训练营导学阶段的基本信息,包括教学系统使用引导、导学阶段视频课程链接与学习引导、训练营教学安排以及教学系统常见问题与解决方案。

通过对本章内容的阅读,同学们能够了解怎么使用训练营的教学系统,并大致了解评分规则。

本章目录

训练营教学系统使用引导

训练营教学系统导学阶段链接

InfiniTensor:人工智能编译器与大模型系统训练营导学阶段

本节目录

个人信息管理

如图所示,通过右上角显示的昵称,选择个人中心,进入个人信息管理。

通过这里的编辑个人信息可以对自己的信息进行补充和修改。

注:为了确保实验成绩在排行榜上正确显示,请确保正确填写了 GitHubName/GiteeName。

如何听课

  1. 首先,你需要进行课程签到,如未完成签到,签到按钮会显示于红圈内“已签到”位置。

  2. 完成签到后可在上课时间点击“进入教室”听课,课程回放会在直播课程结束后于“学习视频”页面上架。

教室使用

进入教室时需要确保给与当前页面足够的权限。

如有需要可通过左下角聊天框向老师提问。

如发现电脑端听课不便,可通过右上角“手机听课”在手机端听课。

注:请优先使用 Chrome 浏览器听课。

成绩查看

实验的最终成绩会显示在晋级榜单页面,此处会显示排名、姓名(授课系统昵称)、学校(如在个人信息内填写)、分数与其他信息。

排行榜上显示的成绩将会作为个人晋级的依据。

组队与组队奖励

训练营允许且鼓励学员组队学习,组队的操作位于“组队信息页面”。关于组队的操作说明如下:

  1. 只有队长可以创建/解散队伍,其余队员只可加入退出。
  2. 包含队长在内,不少于两人的队伍为有效组队,不允许“单人成队”。
  3. 训练营为全员晋级的队伍的队长发放奖品作为鼓励。
  4. 组队情况不影响单人晋级。

导学阶段视频课程链接与学习引导

训练营教学安排

本节目录

里程碑会议

日期内容
2025.01.05 20:00开营仪式

教学安排一览

教学系统常见问题与解决方案

在使用教学系统进行学习或参与活动时,可能会遇到各种技术问题。以下是一些常见问题的解决方案,帮助你顺利完成学习任务和活动参与。

本节目录

1.PC 端教室画面显示异常

如果在使用 Edge 浏览器时遇到教室画面显示不全的问题,可以尝试切换到 Chrome 浏览器。Chrome 浏览器通常对网页的兼容性更好,可以有效避免显示问题。

建议在 PC 端使用 Chrome 浏览器听课,以防止出现类似问题。

2.组队页面无法自己组建队伍

如果你发现自己无法在组队页面创建新的队伍,首先检查你是否已经加入或创建了另一支队伍。每个阶段通常限制每人只能参与一支队伍。如果已加入或创建了队伍,你需要先退出或解散当前队伍,然后才能创建新的队伍。

如果确认没有加入或创建其他队伍,但仍然无法创建新队伍,请确保你已经登录到教学系统。如果登录后问题依旧,建议联系系统管理员寻求帮助。

3.进入教室后发现没有声音

如果在进入教室后发现没有声音,首先检查你是否已经给予教室页面所需的权限,如麦克风和扬声器的访问权限。同时,检查你的本地设备设置,确保扬声器或耳机已正确连接并开启。

如果声音较小,可以在聊天区向授课老师提出,请求调整音量。

4.晋级榜单上的成绩没有准确链接到用户信息

为了确保你的成绩能够正确链接到你的用户信息,你需要在个人信息页面中正确填写你的 GitHubName 或 GiteeName。这些信息是用来识别你的身份并关联你的成绩的。

填写完毕后,重新提交你的代码。这通常可以刷新成绩和用户信息的链接,确保你的成绩正确显示在排行榜上。

5. 添加自己的 GithubName

  1. 进入训练营首页https://opencamp.cn/
  2. 点击右上角个人中心

  1. 点击左侧居中的编辑个人信息按钮

  1. GitHubName字段中输入你的 GitHub 用户名,然后点击保存按钮。这里有一个小问题:GitHubName是什么?
    1. 首先打开github,点击右上角头像
    2. 头像右侧的就是你的 GitHubName,例如:
    3. 那么我的训练营里的 GitHubName 就填17999824wyj

第三章:基本 Git 使用与 Github 流水线(Action)入门

本章概述

训练营的后续实验基于 Github 平台提供的 WorkFlow 服务进行在线的评测与成绩提交,因而本章简要介绍基本的 Git 使用与 WorkFlow 服务配置相关知识,以便于大家开展后续内容。

  • 第一节:常用 Git 指令

    本节将介绍一些常用的 Git 指令,这些指令是 Git 版本控制系统的基本操作,掌握这些指令可以帮助读者更好地管理代码版本。

  • 第二节:Github 使用入门

    本节将介绍如何使用 Github 平台,包括创建仓库、提交代码等基本操作。Github 是一个流行的代码托管平台,许多开源项目都在 Github 上托管。

这一节,要求各位重点看一下“Fork 与 Clone”、“请求合并”和“子模块”!

  • 第三节:GitHub Actions 常见问题与解决方案

    本节将介绍 GitHub Actions 的常见问题与解决方案。GitHub Actions 是 GitHub 提供的持续集成和持续部署服务,可以帮助项目自动化构建、测试和部署代码。一般来说,训练营的实际测试,都是基于 GitHub Actions 进行,但不要求同学们自己写测试代码。因此,同学们只需要掌握 GitHub Actions 的常见问题和解决方案。这对于后续实验非常重要!

这一节,要求重点查看“运行时间过长怎么办”这一部分!

本章目录

常用 Git 指令

Git 是一个强大的版本控制系统,广泛应用于软件开发中可以说,它现在是日常代码开发工作中,不可或缺的工具。本节列出了一些非常常用的指令,如果有不懂的地方,可以查阅官方文档或者询问 AI 以获取帮助。

本节目录

1. 初始化仓库

git init

这个命令会在当前目录创建一个新的 Git 仓库。执行后,目录下会生成一个 .git 子目录,用于存储仓库的元数据和对象数据库。

2. 克隆仓库

git clone <repository_url>

克隆远程仓库到本地。<repository_url> 可以是 HTTPS、SSH 或 Git 协议的 URL。例如:

git clone https://gitee.com/username/repository.git

克隆完成后,你将拥有一个与远程仓库完全相同的本地副本。

3. 添加文件

git add <file>

这个命令将工作目录中的文件添加到暂存区(staging area),准备进行下一次提交。例如:

git add README.md

你也可以使用 git add . 来添加所有更改过的文件。

4. 提交更改

git commit -m "commit message"

提交暂存区的文件到本地仓库,commit message 是对这次提交的描述。例如:

git commit -m "Add initial README file"

5. 查看状态

git status

这个命令显示工作目录和暂存区的状态。你可以看到哪些文件被修改,哪些文件被添加到暂存区,以及哪些文件未被跟踪。

6. 查看提交历史

git log

这个命令显示仓库的提交历史。默认情况下,它会显示每个提交的作者、提交时间、提交信息以及提交的哈希值。

7. 推送更改

git push origin <branch_name>

这个命令将本地仓库的提交推送到远程仓库。<branch_name> 是你想要推送的分支名称。例如:

git push origin master

8. 拉取更新

git pull origin <branch_name>

这个命令从远程仓库拉取更新并尝试合并到当前分支。<branch_name> 是远程分支的名称。例如:

git pull origin develop

9. 创建分支

git branch <branch_name>

这个命令创建一个新分支,但不会自动切换到该分支。例如:

git branch feature-x

10. 切换分支

git checkout <branch_name>

这个命令切换到指定的分支。例如:

git checkout feature-x

你也可以使用 git checkout -b <branch_name> 来创建并切换到新分支。

11. 合并分支

git merge <branch_name>

将指定分支的更改合并到当前分支。

12. 删除分支

git branch -d <branch_name>

删除指定的分支。

注意,如果分支有未合并的更改,Git 会阻止你删除它。

13. 撤销更改

git checkout -- <file>

这个命令撤销对文件的本地更改,将其恢复到最后一次提交的状态。例如:

git checkout -- README.md

14. 撤销暂存区的更改

git reset HEAD <file>

将文件从暂存区移出,但保留本地更改。

15. 撤销提交

git reset --hard <commit_hash>

撤销到指定的提交,<commit_hash> 是提交的哈希值。这将重置工作目录和暂存区,使其与指定的提交完全一致。

Github 使用入门

本节目录

重点看一下“Fork 与 Clone”、“请求合并”和“子模块”!

创建仓库

在 GitHub 上创建新仓库非常简单。首先,登录到 GitHub 账户。然后,点击右上角的"+"号,选择 New repository 来开始创建新仓库的流程。

  • 输入仓库信息:填写仓库的名称,以及可选的描述。这些信息将帮助人们了解,这个仓库是关于什么的。
  • 选择仓库可见性:可以选择公开或私有仓库。公开仓库可以被任何人看到,而私有仓库则需要指定账户才可见。
  • 初始化仓库:可以选择初始化仓库与否。如果选择初始化,GitHub 会自动为仓库添加一个 README.md 文件,这是一个包含项目信息的文档,通常用于向人们介绍项目。
  • 添加忽略文件:创建一个项目时,可以选择添加一个 .gitignore 文件,以帮助 GitHub 忽略不需要的文件。
  • 添加许可证:您可以选择一个许可证(比如 MIT),以定义他人如何使用您的代码。

上面这些步骤大多是可选的,之后,只需要点击 Create repository 按钮,就能创建成功。

仓库管理

在仓库页面,通过最右侧的“管理”你可以进行多种管理操作:

  • 基本信息:编辑仓库的名称、描述、可见性等。
  • 分支保护:设置分支保护规则,防止重要分支被错误地修改或删除。
  • WebHooks:配置 WebHooks,当仓库发生特定事件(如推送代码)时,自动触发外部服务。
  • 部署密钥:添加部署密钥,允许服务器无密码访问仓库。
  • 成员管理:邀请其他用户加入仓库,并设置他们的权限级别。

Fork 与 Clone

在 GitHub 上,你可以通过“fork”功能创建一个项目的副本,这个副本将存储在你的账户下。这是参与开源项目的一种方式。

Fork:在仓库页面上,点击右上角的 Fork 按钮,项目就会被复制到你的账户下。

Clone:为了在本地编辑项目,你需要克隆项目。在仓库页面上,找到并复制仓库的 URL,然后使用 git clone 命令将仓库克隆到本地。

它们之间的区别是,使用 Fork 后,你拿到的是一个副本,而 Clone 后,你拿到的是原始仓库的一个完整拷贝。这就使得,你在进行 push 操作时,对 Fork 的仓库进行的 push 操作不会影响原始仓库,而 Clone 的仓库的 push 操作会影响到原始仓库。所以,在后续的几个阶段,一定记得先 Fork 题目仓库

提交代码

刚刚提到了 push ,在 GitHub 上,你可以通过 push 操作将本地的代码提交到远程仓库。

在本地对代码进行修改后,你需要将更改提交到 GitHub。以下是提交代码的基本步骤:

  1. 添加更改:使用 git add 命令将你的更改添加到暂存区。
  2. (本地)提交更改:使用 git commit 命令将你的更改提交到本地仓库。一般常用 git commit -m <message> ,message 处填写你想要提交部分的说明。
  3. 推送更改:使用 git push 命令将你的本地更改推送到 GitHub,保存至远程服务器。

请求合并

当你在自己的分支上完成了一些更改,并希望将这些更改合并到主分支时,你可以创建一个 Pull Request (简称PR)。

  • 创建 Pull Request:在你的 GitHub 仓库页面上,点击“New pull request”按钮,然后选择你的分支和要合并的目标分支。
  • 填写信息:添加一个标题和描述,一般要说明你的更改内容。
  • 等待审查:提交 Pull Request 后,项目的维护者将审查你的更改。如果有任何问题,他们可能会提出反馈,比如会关闭 PR,代表拒绝你的更改请求。

:在训练营过程中,拒绝 PR 的情况一般发生在:

  1. 你使用的是直接 clone 源仓库,在做完题目后,你直接使用了 push,发现了报错,按照 AI/其它教程 给出的方式进行操作,错误的发起了 PR,这会导致仓库的管理员直接拒绝你的这个 PR。你需要先 Fork 源仓库,再把 Fork 出的仓库拉取到本地,然后把你写好的代码 copy 到本地的新 Fork 出来的仓库,再进行 push 操作,这样就不会出现上述问题。

  2. 在你提交“报告”时,你只提交了你新写的报告,但没有兼容其他人的报告,在管理员这边,看起来就是你把其他人的报告全删掉了,只留下了你自己的,这也会导致你的 PR 被拒绝。你需要 确保你的报告兼容其他人的报告,一般通过先 git pull 一下,然后在 git add 时正确选择范围,来解决此问题。

拉取

在多人协作的项目中,你的本地仓库可能会过时。为了获取最新的更改,你需要使用 git pull 命令来拉取最新的代码。

在训练营过程中,如果发现某些未测试出来的 bug,可能会更新试题的源码,这时你需要拉取最新的代码,以获取最新的试题。

问题跟踪

GitHub 提供了一个问题跟踪系统,可以帮助你跟踪项目中的问题和任务。

  • 创建问题:在仓库页面上,点击 Issues 按钮,然后点击 New issue 按钮来创建一个新的问题。
  • 编辑问题:你可以添加标题、描述,甚至标签来帮助分类和跟踪问题。

子模块

在 GitHub 中使用子模块(submodule)是一种将一个仓库作为另一个仓库的一部分来使用的方法。以下是如何使用 GitHub 子模块的基本步骤:

  • :添加子模块使用 git submodule add 命令添加子模块。这个命令会创建一个 .gitmodules 文件,并在其中记录子模块的信息。

例如:使用如下命令时:

# git submodule add <子模块内容> <待添加子模块的本地仓库的路径>
# 例如:
git submodule add <某远程仓库地址> ./exam-grading
# 注:子模块内容,如果你把远程仓库拉取下来了,可以直接传拉取下来的那个仓库的本地地址,相对绝对都行!
# 注:远程仓库的权限,必须是public,不然会找不到而报错!

这会在对应路径添加子模块。注:添加后,记得用 push 提交到远程,要走 commit + push 的流程!

  • clone:当克隆一个含有子模块的仓库时,需要初始化并更新子模块。由于子模块没有被拉取,且可能是单独的一个 git 仓库,并且可能会依赖更多的子模块,所以需要递归拉取:
# 先 clone
# 再 cd 进去
# 之后用下面的命令:
git submodule update --init --recursive
  • 更新:当需要更新子模块到最新版本时,进到对应的子模块目录,然后直接拉取代码即可。
  • 删除:删除比较麻烦,基本不太会用到。所以,为了培养大家的自学能力,请自行找资料。大致流程为:
    1. 删除子模块内容(自己找对应的 git 命令)。
    2. 编辑 .gitmodules 文件删除与子模块相关的条目。
    3. 编辑 .git/config 文件删除与子模块相关的配置。
    4. 将更改推送到远程。

官方文档

GitHub 的官方文档是学习 GitHub 的最好资源之一。你可以在GitHub Help上找到详细的指南和教程,帮助你更好地使用 GitHub。

GitHub Actions 常见问题与解决方案

这部分在导学阶段,可能不太会涉及到,但在后续阶段,可能会很常见!故,推荐同学们在这里先浏览一遍。

在使用 GitHub Actions (在 Gitee 里称为 Gitee Go ,中文译作流水线) 进行代码托管和自动化测试时,可能会遇到各种问题,如工作流不执行、时间耗尽、运行时间过长等。以下是针对这些常见问题的详细解决方案,请重点查看“运行时间过长怎么办”这一部分!

本节目录

1. 在启用 GitHub Actions 并向仓库 push 代码后工作流不执行

  • 检查 Actions 时间:首先确认你的仓库 Actions 时间是否已经耗尽。如果时间耗尽,工作流将不会执行。
  • 手动触发工作流:如果 Actions 时间未耗尽,尝试在 Actions 页面手动触发新的工作流。使用仓库中的工作流配置文件,配置文件通常位于 .github/workflows/main.yml
  • 修改配置文件:如果手动触发工作流后问题依旧,尝试修改配置文件中的作业名称或步骤名称,然后重新提交。
  • 重新 fork 仓库:如果上述步骤都无法解决问题,尝试重新 fork 仓库,然后再次推送代码。
  • 手动创建新仓库:如果重新 fork 仓库后问题仍未解决,可以尝试根据当前仓库内容手动创建一个新仓库,但不进行 fork 操作,直接把工作流的代码和你完成后的代码 copy 到新仓库里。

2. 在启用 GitHub Actions 时不小心创建了默认工作流

  • 删除默认工作流:默认工作流的运行不会影响自定义工作流的运行,但会消耗时间。你可以在 Actions 页面手动删除默认工作流。自定义工作流的默认名称可能为“ci”或“cd”。

3. 仓库 GitHub Actions 时间耗尽怎么办

  • fork 一个仓库:如果仓库的 Actions 时间耗尽,最简单的解决方案是再 fork 一个仓库,然后继续使用。

4.工作流运行时间过长怎么办

  • 手动取消运行:如果工作流运行时间过长,可以手动取消运行。然后查看工作流日志,确定导致运行时间过长的原因。理论上,单次工作流运行时间不应超过 20 分钟。
  • 换个人少的时间段:如果工作流运行时间过长,可以尝试在其它时间段运行,例如工作日的上午或下午。一定尽量避免在晚上、凌晨或者周末运行,按照规律来看,这些时间非常容易出现工作流运行时间过长的问题。

根据其它训练营的情况来看,工作流运行时间过长的原因很可能是因为某段时间内,使用相同父仓库 clone 下来的工作流代码,被多个用户同时运行,导致 Github 后端预留的服务器数量等资源产生严重竞争,导致类似死锁或饥饿的情况发生,反映到前端就是,工作流运行时间极长,但仍旧没有结果。

5. 工作流日志无法生成

  • 尝试其他设备或浏览器:如果工作流日志无法生成,尝试使用手机或其他浏览器查看。有时候,问题可能是由于浏览器兼容性或缓存问题导致的。

第四章:打卡 InfiniLM

本章概述

本章旨在引导用户了解并实践使用 InfiniLM,一个大模型引擎。通过对本章的阅读,用户将能够掌握如何获取模型、如何编译和运行模型,以及如何利用 InfiniLM 提供的相关服务使用大模型。

在第一节和第二节我们将介绍如何拉取 InfiniLM 的官方仓库以及如何下载示例模型,为后续的模型编译和运行做好准备。接着,我们将详细讲解编译 InfiniLM 模型的具体步骤和运行方法,确保用户能够顺利地在本地环境中使用 InfiniLM。

在第三节,将概述 InfiniLM 提供的其他服务,帮助用户更全面地了解 InfiniLM 的功能和应用范围,以及最基本的调参方法。

通过本章的学习,用户不仅能够学会如何使用 InfiniLM,还能够对大语言模型有一个较为基本的理解,为后续的研究和应用奠定坚实的基础。

注:运行过程中产生的问题请查阅Q & A,实在解决不了,再在微信群聊中咨询助教和老师!

本章目录

拉取仓库 & 示例模型下载

注:运行过程中产生的问题请查阅Q & A,实在解决不了,再在微信群聊中咨询助教和老师!

本节目录

1. 拉取引擎仓库

git clone https://github.com/InfiniTensor/InfiniLM

注:有时候网络质量不好导致拉取超时,则可以尝试等网络质量好的时候再下载!

此步骤结束后,应该如下所示:

# PS: 有美元符的代表命令,没有的代表输出
$ ls
InfiniLM

然后我们需要将分支切换一下:

$ cd InfiniLM
$ git switch version1

之后确认一下我们的操作没问题:

$ git branch
  main
* version1

2. 下载模型

下载命令

注:此部分以“TinyLlama-1.1B-Chat-v1.0”模型为例,此模型的源下载网站为:“ https://huggingface.co/TinyLlama/TinyLlama-1.1B-Chat-v1.0 ”(需要魔法),建议使用 “ https://hf-mirror.com/TinyLlama/TinyLlama-1.1B-Chat-v1.0 ”的镜像,下面以从镜像网站下载为例:

输入命令:

GIT_LFS_SKIP_SMUDGE=1 git clone https://hf-mirror.com/TinyLlama/TinyLlama-1.1B-Chat-v1.0

参数解释:

GIT_LFS_SKIP_SMUDGE=1:跳过 LFS 的 smudge 操作,即跳过 LFS 的文件预处理操作。

因为模型中,有一个“模型参数”文件,其占用磁盘较大,示例占了 2.2G,导致 git 拉取时,极其容易超时,所以使用此参数跳过此文件,之后我们手动对需要用 LFS 下载的文件进行下载。

手动下载方式:

在镜像网站上,点击下面框起来的内容: 在镜像上手动下载模型LFS文件

注:手动下载的两个文件,一定要放置到刚刚用 git 下载的目录里!

完成标志

在某一文件夹内,存放有拉取到的模型:

./TinyLlama-1.1B-Chat-v1.0/
|
|-- README.md
|-- eval_results.json
|-- model.safetensors
|-- tokenizer.json
|-- tokenizer_config.json
|-- config.json
|-- generation_config.json
|-- special_tokens_map.json
|-- tokenizer.model

编译模型 & 运行

注:运行过程中产生的问题请查阅Q & A,实在解决不了,再在微信群聊中咨询助教和老师!

本节目录

目录路径展示

此部分为展示我的目录路径,不需要读者做相同操作,只是方便读者阅读使用。

D:/project-8/
|-- InfiniLM
    |-- # 此部分就是引擎仓库,具体内容除Cargo.toml,略
    |-- Cargo.toml
    |-- ...
|-- models
    |-- # 此部分是模型文件夹,我用它来存放所有的模型
    |-- TinyLlama-1.1B-Chat-v1.0
        |-- # 此部分就是刚刚下载的模型,里面必须至少有以下3种文件:
        |-- config.json                 # 模型配置文件
        |-- model.safetesnors           # 模型参数文件
        |-- tokenizer.model/vocab.txt   # 分词器词表
        |-- ...
    |-- TinyLlama-1.1B-Chat-v1.0_F16
        |-- # 此部分最开始没有,在我们“精度转化”操作后,得到此文件夹
        |-- ...

精度转化

cd InfiniLM # 切换至InfiniLM目录内
# 然后参照官方文档
# 我们直接编译刚刚下载的模型,要先转化精度为f16
# 我的目录路径如上所示,请自行修改下面参数:
cargo cast --model D:/project-8/models/TinyLlama-1.1B-Chat-v1.0/ --dt f16
# 然后,就会在 D:/project-8/models/ 文件夹内生成一个 TinyLlama-1.1B-Chat-v1.0_F16 文件夹

完成标志

你的目录结构,应该与上面展示的目录结构类似。

运行

cd InfiniLM # 切换至InfiniLM目录内
# 然后参照官方文档,即可完成
cargo chat --model D:/project-8/models/TinyLlama-1.1B-Chat-v1.0_F16

展示输出: 引擎运行结果图

其它服务

注:运行过程中产生的问题请查阅Q & A,实在解决不了,再在微信群聊中咨询助教和老师!

本节目录

获取帮助

在命令行窗口下,通过:

cargo chat --help
# 或者
cargo chat -h

可以查看 chat 可用的命令。

而这个 InfiniLM,提供了 chat 模式、 generate 模式和 service 模式。其中, chat 模式,就是上面展示的对话模式; generate 模式,就是生成文本的模式; service 模式,就是提供 HTTP 服务,供其它应用调用的模式。

你可以通过分别指定模式,输入:

cargo generate -h
# 或者
cargo service -h

来查看 generate 模式和 service 模式的参数使用方法。

参数介绍

通过 -h--help ,可以得到可用参数列表:

  • --model 指定模型名称,要精度转换后的名称,例:D:/project-8/models/TinyLlama-1.1B-Chat-v1.0_F16。此命令可以用 -m 代替。
  • --log 指定日志的模式,支持debuginfowarnerroroff
  • --temperature 指定生成文本时的温度值,控制生成文本的随机性,值越高生成的文本随机性越大。
  • --top_p 指定生成文本时的 Top-P 值,控制生成文本的最小概率阈值,值越高生成的文本多样性越低。
  • --top_k 指定生成文本时的 Top-K 值,控制生成文本时考虑的前 K 个词的数量,值越高生成的文本多样性越高。

具体说明

大模型是建立在“随机加权”这一机制下的,其大致的工作原理是,在生成文本(即进行回答)时,会根据模型训练出来的权重,随机选择下一个词,而权重越高,选择的概率越大。

在实施词汇选择的过程中,模型首先筛选出一个“备选词集”,然后从这个集合中选定一个词汇作为输出。top_k 就是决定这批“备选词”的数量的参数。

对于 temperature 参数,其较难解释,可以简单的理解为“偏移量”,当在备选词集合中挑选词汇时,朴素的想法是,直接挑选概率最高的词,但这会导致,只要你的提问不变,那么每次生成的文本就都完全一样,因此,引入 temperature 参数,使得在备选词集合中,概率最高的词,被选中的概率降低,而其它词被选中的概率增加,从而使得生成的文本更加随机。

对于 top_p 参数,它根据概率分布的累积概率来选择候选词汇。具体来说,模型会根据每个词汇的概率进行排序,然后选择累积概率达到 top_p 值的那部分词汇作为候选集。例如,如果 top_p 设置为 0.9,那么模型会选出概率最高的词汇,直到它们的累积概率达到 0.9。在候选集中,每个词汇最终被选中的概率是相等的。top_p 的推荐取值范围通常在[0.5, 1.0]之间,这个值决定了采样的范围,值越低,采样的词汇越多,文本的多样性越高,值越高,概率加和后高于此值的、最终可能能够被采样的词汇就越多,文本的多样性越高。

第五章:评分系统的使用

本章概述

本章的主要内容为,向学员们介绍Exam Grading 自动测试评分系统的使用,完成构建自己的评测系统用于后续阶段的测验提交,并熟悉评测系统的使用。

在第一节,我们介绍了如何本地部署评分测试系统。

在第二节,我们介绍了如何实际使用评分系统进行测试,最后的结果是,能够在导学阶段排行榜上,看到你的名字。

注:运行过程中产生的问题请查阅Q & A,实在解决不了,再在微信群聊中咨询助教和老师!

本章目录

下载环境

注:运行过程中产生的问题请查阅Q & A,实在解决不了,再在微信群聊中咨询助教和老师!

本节目录

准备 Git 环境

Git 的安装可参考:1.5 起步 - 安装 Git 或 本书第一章第一节

获取 exam-grading 源码

学员需要通过 exam-grading 模板 创建自己的评分系统仓库:

create-repo

NOTICE 推荐创建为 private 仓库,自己部分的仓库名可以随便起,如下图:

之后将创建的 exam-grading 仓库拉取到本地

git clone '打马赛克的那一堆的实际网址' ./exam-grading
cd exam-grading

NOTICE 仓库网址打马赛克了,请自行替换,如果不会这么看或者不会拉取,那就复习本书的第三章第二节的对应内容。

实际操作的示例

该部分将通过给评分系统添加 exams 目录以演示测验评分系统的使用方法。

注:运行过程中产生的问题请查阅Q & A,实在解决不了,再在微信群聊中咨询助教和老师!

注:推荐使用“子模块”方式,使用此系统。

首先需要在 Github 上创建一个测试仓库(只需包含一个 README 即可),权限设置为 public,否则之后测试拉取会因为没有权限而报错找不到仓库。创建好测试仓库之后可通过两种方式添加将该测试仓库添加至评分系统:直接目录子模块

本节目录

通过 "直接目录" 使用此系统

通过直接目录的方式添加测试目录,需要学员将目标测试目录克隆到评分系统中:

# 首先进入到exam-grading的项目目录内
cd exam-grading
git clone <target-test-repo> ./exams
cd exams
# 确保为最新
git pull

通过 "子模块" 使用此系统

子模块方式则只需将对应测试目录以子模块的方式加入评分系统即可:

# 首先进入到exam-grading的项目目录内
cd exam-grading
# 下面尖括号内的内容,替换为你刚刚新建的那个远程仓库的地址
# 第二个参数,请写死为“exams”!如果没有,那么测试不会运行!
git submodule add <target-test-repo> ./exams
# 确保为最新
git submodule update --remote
# 然后 git add
git add .

预期结果如下图,通过 git status 查看:

添加测试目录后,学员即可提交更改到远程仓库,评测系统将会自动运行。

通过以下命令提交:

# add 那步刚刚做完了!
git commit -m "你想提交的信息,一般来说,要符合你所做的实际更改内容,比如增加了什么,完成了什么"
git push

运行结果可以在仓库 actions 界面查看:

NOTICE 此处提交的内容为新增的 exams 目录,若使用子模块方式还会有一个 .gitsubmodule 文件,如果你放置的,是其它名字的目录,那么对应的远程仓库的产物名字也是你改的那个名字。

注:待测试仓库,请写死为“exams”!如果没有,那么测试不会运行!

目标运行结果:

成功标志

在训练营导学阶段的排行榜中,看到你的名字(如果看不到,可能是你没改个人信息,或者 Actions 运行出错,如果是后者,请去群里联系班主任或助教)。

导学阶段训练营首页链接:https://opencamp.cn/InfiniTensor/camp/2024winter/stage/0?tab=rank

导学阶段 Cpp 排行榜链接:https://opencamp.cn/InfiniTensor/camp/2024winter/stage/1?tab=rank

导学阶段 Rust 排行榜链接:https://opencamp.cn/InfiniTensor/camp/2024winter/stage/2?tab=rank

注:在评分一样的情况下,按照时间排序,请自行寻找自己的位置。同时,记得要在你 push 后,等 5 到 10 min!

打卡 Cpp 测试(2024 冬季)

目录

前置要求

  • 会基础的 git
  • 在训练营里绑定了 githubName,教程见此

实际操作步骤

  1. fork 后,用 git pull 拉取 C++测试题集
  2. 本地做题后,push 到自己 fork 的仓库
  3. 将该仓库,添加为 exam-grading 的子模块,必须命名为learning-cxx
  4. exam-grading push 到自己的评分系统仓库。

注:切记先 Fork !

成功标志

push 完毕后,应该能在cpp 的排行榜上看到你的名字,分数应该是 0 分。

QA

如有类似“为什么本地测试过了提交后榜单上还是没有我”的疑问,或 push 完毕后没有看到自己上榜,则请看此处

打卡 Rust 测试(2024 冬季)

目录

前置要求

  • 会基础的 git
  • 在训练营里绑定了 githubName,教程见此

实际操作步骤

注:如果还有问题,请去看 2024 夏季训练营的基础阶段第一课,杨老师的演示视频!

  1. 参照 rustlings 官方的测试题集使用教程进行使用,然后将此仓库放置到 github 远程仓库内,且设置为 public
  2. 本地做题后,push 到自己在第一步中 create 的远程仓库。
  3. 将该远程仓库,添加为 exam-grading 的子模块,必须命名为 rustlings
  4. exam-grading push 到自己的评分系统仓库。

成功标志

push 完毕后,应该能在rust 的排行榜上看到你的名字,分数应该是 0 分。

QA

如有类似“为什么本地测试过了提交后榜单上还是没有我”的疑问,或 push 完毕后没有看到自己上榜,则请看此处

Q & A

目录

1. Cpp 第 30 题

有同学提到,Cpp 的析构顺序与平台是相关的,具体情况如下:

在 windows 里(MSVC):

在 kali 里(gcc):

可以看到,虽然代码一样,但析构顺序是不同的。此问题的解决方法是,请确保析构顺序是确定的,即以 CI 中的 gcc 顺序为标准。

2. 为什么本地测试过了,提交后榜单上还是没有我?

这个情况非常常见...,但根据经验,只有极小部分是由于训练营的后端出现了问题,更大可能是你的操作出现了问题,大致排查的流程如下:

  1. 本地测试过了,提交也过了,但,你真的提交成功了吗
    1. 首先你需要确定,你的提交真的成功了,确定方法是,进入 github 内,到你的那个exam-grading仓库里,看看是否出现了你提交的代码(不管是子模块还是目录,都必然应该有),如下图,蓝色的是子模块提交上来的,黑色的是目录,你需要点进去看看你的代码是否在里面
    2. 在确定你写的代码在里面之后,你需要先去看看,是不是远程运行测试过程中出现了问题。操作流程是,在进入到 github 里的,你的那个exam-grading后,点击上面的 Actions,看 workflow 的状态。如果报红,那就说明,可能是测试本身出了问题,这时候请去群里问助教。如果是绿色的,请继续排查。下图是绿色的示例:
    3. 点进去最上面的那个绿色的 workflow,先看到的应该类似下面的图,绿色的代表被执行了,灰色的代表被跳过了,下图中展示的是导学阶段的两个测试被成功执行,专业阶段的被跳过了,被跳过的原因是命名不对
    4. 如果上面这些也都正常了,那么,恭喜你,你的提交应该已经成功了,那么就需要继续排查了...
  2. 提交成功后没有出现名字的,大致是下面三种情况:
    1. 最常见的是,你没有在训练营里绑定你的 GithubName,绑定教程点这里必须保证,先绑定了,再进行测试,如果已经测试完了才绑定,那就需要重新测试,方法是,rerun action,具体操作自行百度
    2. 另一种情况是,你的exam-grading版本过老,需要更新,更新时,最小量操作的方法是改一下你的exam-grading/.github/workflow/test.yml,把它从官方模板里复制一份贴进去,然后重新 push 一份代码跑测试
  3. 还有可能是其它种种情况,如遇此,请去群里问助教

往期 QA 导航

Q & A

目录

1. 除了 cpp 和 Rust 还需要什么专业基础嘛?

材料还在整理和补充,会陆续放出

2. 直播有回放吗?

有的,每个阶段中的学习视频栏目中将可见每次课程直播回放

3. C++ 或者 Rust 对后续专业阶段和项目阶段有什么影响吗,比如某一方向要求是 Rust

AI 编译器是 cpp 做的,大模型推理是 Rust 做的。我们鼓励学员们选择多个方向,难度都不是特别大,专业阶段中不同方向的上课时间也不同,不用担心上课时间冲突

4. 关于 InfiniTensor 拉取

这个项目通过 http 进行拉取会出现没有权限的问题,需配置 Github ssh 密钥来通过 ssh 进行克隆到本地操作: 第一步:检查本地主机是否已经存在 ssh key

cd ~/.ssh
ls
# 查看是否已存在id_rsa和id_rsa.pub文件
# Windows系统则查看C:\Users\<Your Username>\.ssh文件夹下
# 存在可直接看第三步

第二步:生成 ssh key

ssh-keygen -t rsa -C "xxx@xxx.com"
# 一直回车即可
# Windows系统下同理,不想要后面一串也可以直接运行ssh-keygen指令

第三步:获取 ssh key 公钥内容并添加到 Github

复制 id_rsa.pub文件内的内容,之后 Github 右上角点击头像->Settings->SSH and GPG keys->右上角蓝色 New SSH key 按钮->将复制的内容粘贴到 Key 输入框中添加 title 以便管理->最后点击 Add SSH key 即可 验证是否配置 ssh 公钥成功可运行 ssh -T git@github.com指令,看见输出 Hi xxx! You've successfully authenticated, ...即可 之后即可运行 git clone git@github.com:InfiniTensor/InfiniTensor.git克隆 InfiniTensor 到本地

5. InfiniLM 支持问题

目前 InfiniLM 只支持 Llama。对于中文输入,一个方面是使用模型的中文能力问题,另外采样中有些技巧可以控制输出的长度和风格目前并未实现于 InfiniLM,设置一下采样参数会好些

6. 关于导学阶段安排

目前导学阶段直接在社区网站阅览学习即可,以及尝试导学实践内容 -- 部署运行 InfiniLM 到本地,以及 exam-gradings 的部署与应用

7. 关于后续基础阶段内容问题

后续基础阶段分为 C++基础和 Rust 基础,目前导学阶段若没有 Rust 基础建议可以尝试学习,Rust 方向可提前练习Rustlings(之后基础阶段-Rust 基础方向也将以此为阶段评测),C++方向的测评题目还在编写,目前只能自行复习练习

8. 关于 InfiniLM 运行问题

  • 遇到以上输出为模型(TinyLlama)文件拉取不完整导致,对于 lfs 大文件需要手动下载放入模型文件中
  • 关于 Rust 环境,运行 InfiniLM 需要将 Rust 版本更新至最新的 stable(1.79.0),或者大于等于这个版本的 nightly 也行

9. 关于社区平台的课程录播问题

遇到录播视频加载不出来可稍微等待或进行刷新,此为先前录制时的平台问题

10. 这个训练营和编译器有啥关系?

> 深度学习编译器和编译器是两个东西,就好像 javascript 和 java 是两个东西。
>
> 或参考知乎问答[神经网络的编译器和传统编译器的区别和联系是什么?](https://www.zhihu.com/question/396105855)

11. 后续的 AI 编译器主要是做 cuda 后端的吗?

> 考虑到显卡持有量原因,cuda 是一个单独方向(课也是单独的,作业也是单独的)。
>
> AI 编译器方向主要讲硬件无关的框架和优化知识。
>
> Q:主要是概念吗?有没有深入理解或者实战写 pass 这些环节?
>
> A:第一节课主要讲概念和框架结构,后面几节课都和项目联系挺紧密的,会结合代码举例介绍优化技巧。

12. 后期的编译器项目,是在 InfiniTensor 还是 RefactorGraph 基础上做的?

> 这个暂时没有定,近期会确定好告诉大家,讲课时两个框架都会介绍。

13. 训练营的 C++ 使用什么标准?

> - InfiniTensor 使用 C++17;
> - RefactorGraph 使用 C++20;

14. 有没有正式课程的文档?对于有 Rust 经验的学生可以先看看正式课程

> 暂时还没有,有基础的可以看[上期训练营的回放](https://opencamp.cn/os2edu/camp/2024spring/stage/10?tab=video)

15. InfiniLM 不用 Nvidia 显卡能运行吗?

> 可以的,不过现在即使不用 Nvidia 显卡,检测到环境也会编译。也可以在 `xtask/Cargo.toml` 里关掉默认 `features` 解决。
>
> ```toml
> ...
>
> [features]
> default = ["nvidia", "cambricon"] # 去掉nvidia即可
> nvidia = ["llama-nv", "llama-nv-distributed"]
> cambricon = ["llama-cn"]
> ```

16. cpp 和 rust 的题是开营后才公布吗?

> 正在开发中,不过在开营前肯定会准备好公布给大家,最早可能下周公布。

17. rustling 可以用之前训练营的 rustling 替代吗?

> 我们会用更新版的,题目差别不大但是用法不同。

18. 基础阶段的 cxx 和 rust 题目都是什么类型?算法题吗?

> cxx 题目类型类似 rustlings,语法部分占大多,并做了一个类似 rustlings 的学习软件,难度都比较低。

19. 项目有没有整体架构图可以看看?

> 暂时还没,开发不久,架构变化还挺激烈,不过后续课程会根据现有的画一个。

20. AI 编译器方向需要先学线代吗?

> 我们几乎不搞训练,至少不开发训练框架,所以几乎不需要微积分;概率论只有采样的时候需要一点;项目应用中主要是最基础的线性代数,矩阵乘和转置。

21. 如何判断 InfiniLM 是仅 CPU 运行的还是 CUDA 运行的?

> 要是运行时没传递 `--turbo nv` 参数就就没有使用 CUDA 运行了,就是用 CPU 推理运行。
> ![cmd-args](./resources/cmd-args.png)
> 注:本词条回答时间为 2024.07.16,后续会添加更多参数,请以实际运行输出为准。查看参数列表,请见:[获取帮助](./ch4-03.md#获取帮助)

22. 如果 InfiniLM 运行 cargo xtask list-turbo 没有返回可用的 Turbo hardware 怎么办?

> 若设备确实存在 N 卡,这种情况为检测不到你的 CUDA,一般来说看一下环境变量 `$CUDA_ROOT`。
> **NOTICE** Windows 环境下可通过 powershell `$env:CUDA_ROOT` 进行查看。Linux 则使用 `echo $CUDA_ROOT` 查看
> 若没有则需要检查 CUDA toolkit 的安装后再试,确认装好了 CUDA toolkit,然后设置 `CUDA_ROOT` 环境变量,之后运行 `cargo clean` 后再重新编译运行。
>
> - 若编译运行后产生大量 warnings 且报错失败:
>   ![cuda-warnings](./resources/cuda-warnings.png)
>   可以选择:
>   - i. `export CXX=g++-13` 指定 g++ 编译器版本,再次编译运行
>   - ii. 换个干净环境重新来(docker)
>   - iii. 弃坑关了 cuda features 退回 CPU
>
> 理想运行输出:
> ![expect-cuda](./resources/expect-cuda.png)

23. 模型需要多少显存,2GB 好像不够

> 平时用的大概 6G 显存可以跑 2B 模型,理论上 2G 跑 1B 够用的但是系统总要占点。目前量化还在开发中,近期我们看看能不能找一些更小的模型跑起来。

24. InfiniLM 推荐在 wsl 运行还是直接在 win 运行啊?

> win 环境能配好就推荐 win,wsl2 磁盘速度受限
> 非专业版 VMWare 可能无法检测到 GPU 的存在,如果想要用 GPU,那么尽量不要用 VMWare

25. InfiniLM 是怎么检测 CUDA 的?

> InfiniLM 通过调用 [find_cuda_helper](https://crates.io/crates/find_cuda_helper) 查找 CUDA 环境

26. 运行 exam-grading 提交评测报错找不到子模块

> ![](./resources/找不到子模块.png)
> 以上输出一般是因为添加的子模块 GitHub 仓库权限为 private 导致的,将要添加为子模块的仓库权限设置为 public 即可。

27. 除了 TinyLlama 还有没有其他能在 InfiniLM 框架中运行的更大的模型?

> 可以上 [huggingface](./ch4-01.md#2-下载模型) 上寻找一下,不过 Llama 2 和 3 在模型结构上兼容,但 `tokenizer` 不兼容,导致跑不起来。
> 也可以看一下启元推出的九格 8B 模型:[模型仓库](https://www.osredm.com/jiuyuan/CPM-9G-8B/tree/master/quick_start_clean/readmes/README_ALL.md)

28. 用的 mac air,配置在后续跟不跟的上呢?

> CUDA 方向不行,其它都没问题

29. exam-grading:如果 initialize submodules and check for experiments 成功了,但是 test job for other submodules 跳过了是什么原因?

> 原因是没检测到 `exams` 目录,test job for other submodules 这个任务只有在检测到 `exams` 目录存在才会运行

30. 是否也能让 InfiniLM 支持 AMD 的显卡呢?

> 暂时没有这个支持计划,NVIDIA 之后是国产硬件

31. Mac 的 GPU 是不是还没有支持?

> 由于不知道 Mac 的 GPU 如何开发,就当 Mac 没有 GPU 吧

Q & A

目录

1. Cpp 第 30 题

有同学提到,Cpp 的析构顺序与平台是相关的,具体情况如下:

在 windows 里(MSVC):

在 kali 里(gcc):

可以看到,虽然代码一样,但析构顺序是不同的。此问题的解决方法是,请确保析构顺序是确定的,即以 CI 中的 gcc 顺序为标准。

2. 为什么本地测试过了,提交后榜单上还是没有我?

这个情况非常常见...,但根据经验,只有极小部分是由于训练营的后端出现了问题,更大可能是你的操作出现了问题,大致排查的流程如下:

  1. 本地测试过了,提交也过了,但,你真的提交成功了吗
    1. 首先你需要确定,你的提交真的成功了,确定方法是,进入 github 内,到你的那个exam-grading仓库里,看看是否出现了你提交的代码(不管是子模块还是目录,都必然应该有),如下图,蓝色的是子模块提交上来的,黑色的是目录,你需要点进去看看你的代码是否在里面
    2. 在确定你写的代码在里面之后,你需要先去看看,是不是远程运行测试过程中出现了问题。操作流程是,在进入到 github 里的,你的那个exam-grading后,点击上面的 Actions,看 workflow 的状态。如果报红,那就说明,可能是测试本身出了问题,这时候请去群里问助教。如果是绿色的,请继续排查。下图是绿色的示例:
    3. 点进去最上面的那个绿色的 workflow,先看到的应该类似下面的图,绿色的代表被执行了,灰色的代表被跳过了,下图中展示的是导学阶段的两个测试被成功执行,专业阶段的被跳过了,被跳过的原因是命名不对
    4. 如果上面这些也都正常了,那么,恭喜你,你的提交应该已经成功了,那么就需要继续排查了...
  2. 提交成功后没有出现名字的,大致是下面三种情况:
    1. 最常见的是,你没有在训练营里绑定你的 GithubName,绑定教程点这里必须保证,先绑定了,再进行测试,如果已经测试完了才绑定,那就需要重新测试,方法是,rerun action,具体操作自行百度
    2. 另一种情况是,你的exam-grading版本过老,需要更新,更新时,最小量操作的方法是改一下你的exam-grading/.github/workflow/test.yml,把它从官方模板里复制一份贴进去,然后重新 push 一份代码跑测试
  3. 还有可能是其它种种情况,如遇此,请去群里问助教

附录 A:可供参考的资料

注:选择适合自己的!

Rust 学习资料

入门书籍:

  1. Rust by Example
  2. Rust 语言圣经
  3. Rust 语言之旅
  4. The Rust Programming Language

入门课程:

  1. 清华计算机系大一学生 2022 暑期课程:Rust 程序设计训练
  2. CS 110L: Safety in Systems Programming : spring 2020

小练习:

  1. rustlings
  2. 32 Rust Quizes
  3. Rust 语言实战(Rust 语言圣经配套习题)

进阶:

  1. 死灵书
  2. Learn Rust With Entirely Too Many Linked Lists
  3. The Cargo Book
  4. Algorithm in Rust: 基于 Rust 语言的经典算法

其它:

Rust Languange Cheat Sheet

Git 学习资料

  1. Pro Git
  2. Git 教程 | 菜鸟教程
  3. Git 教程 | 廖雪峰
  4. Learn Git Branching

线代基础

  1. MIT18.06: Linear Algebra
  2. 线性代数的本质-3Blue1Brown
  3. The Art of Linear Algebra

附录 B:能够运行项目的设备合集

目前来看,大部分设备都应该可以,甚至手机也可以!
我的电脑内存 16G,可以运行,大约消耗了磁盘 10G 以内的空间

下面是已经成功打卡的设备信息:

CPU 型号显卡型号内存大小设备系统设备架构
AMD RyzenAMD Radeon(TM) Vega 8 Graphics16GWindows 11 家庭版x86 指令集
13th Gen Intel(R) Core(TM) i9-13900KGeForce RTX 309064Garchlinuxx64
12th Gen Intel(R) Core(TM) i5-1240P16GWindows 11 家庭版x86 指令集
AMD Ryzen 7 7735HNVIDIA GeForce RTX405016Gwindows11 家庭版x64
Intel i7-8650U (8) @ 4.200GHzIntel UHD Graphics 62016GUbuntu 22.04.4 LTSx86 指令集
Intel(R) Core(TM) i9-9900KF CPU @ 3.60GHzNVIDIA GeForce RTX 2080 Ti32GWindows 10 专业版(20H2)x64
13th Gen Intel(R) Core(TM) i7-13700HNVIDIA GeForce RTX 4060 Laptop GPU64.0 GBWindows 11 Homex64
AMD Ryzen 7 5800H16GWindows 11 专业版x64
Intel(R) Core(TM) i7-10510U CPU @ 1.80GHzNVIDIA GeForce MX2502Gdebian 12x64
Apple M116GmacOS Monterey 12.7.1ARM
12th Gen Intel(R) Core(TM) i7-12700H (20) @ 4.70 GHzNVIDIA GeForce RTX 3060 Mobile / Max-Q [Discrete]40GNixOS 24.11 (Vicuna)x86_64
英特尔 ® 酷睿 ™ i9-13900HX 处理器(睿频可达 5.4 GHzNVIDIA® GeForce RTX™ 406016GWindows 11 专业版x64
Intel(R) Core(TM) i5-9400F CPU @ 2.90GHzAMD Radeon RX 580 2048SP16GWindows 11 Homex64
Intel(R) Core(TM) i5-10210U CPU @ 1.60GHz (8 CPUs),~2.1GHzNVIDIA GeForce MX25012Gwin11(家庭版)x64
AMD Ryzen 5 5800xNVIDIA GeForce RTX 3080 Ti32Gwin10x86
Intel(R) Core(TM) i5-13600KFNVIDIA GeForce RTX 4090 D64Gnixos24.05x86_64
AMD Ryzen 5 5500UAMD Radeon(TM) Graphics16GWindows 10 家庭中文版x64
11th Gen Intel(R) Core(TM) i7-11800H @ 2.30GHzNVIDIA GeForce RTX 3060 Laptop GPU24GWindows 11 Home64-bit operating system, x64-based processor
AMD Ryzen 7 5800H with Radeon GraphicsNVIDIA GeForce RTX 3060 Laptop GPU16GWindows11 家庭版x86_64
13th Gen Intel(R) Core(TM) i9-13900HXNVIDIA GeForce RTX 4060 Laptop GPU32GWindows11 家庭版x86_64
Intel(R) Core(TM) i7-9750H CPU @ 2.60GHzNVIDIA GeForce RTX 105032GWindows 10 Homex86_64
Intel(R) Core(TM) i5-12600KFNVIDIA GeForce RTX 306012GWindows 10 工作站版 (22H2)x86_64
Apple M2Max64GmacOS Sonoma 14.3.1ARM
Apple m2Pro

此表格仍在不断更新中,目前更新到了第 32 位,时间为 2024-07-19……