Latest commit

History

History

Folders and files

NameName
Last commit message
Last commit date

parent directory

..

readme.md

Python

B站封面

Intro

欢迎来到书生浦语大模型实战营基础部分Python关卡,本关主要由以下四大块内容组成:

  • Conda虚拟环境
  • pip安装三方依赖包
  • VScode中的Python Debug
  • 调用InternLM API
  • Python基础语法

学习完成后,完成以下两个任务并经过助教批改视为闯关成功

任务类型任务内容预计耗时
闯关任务Leetcode 38315mins
闯关任务Vscode连接InternStudio debug笔记15mins

任务具体描述见task.md

TIPS:本关内容覆盖较多,知识点较杂,如果有不清楚或者不懂的地方可以随时提问。同时如果觉得教程有问题的地方也请随时提出,让我们一起把本教程优化得更好,帮助更多的人走进大模型的世界。

Ch1 Conda虚拟环境

虚拟环境是Python开发中不可或缺的一部分,它允许你在不同的项目中使用不同版本的库,避免依赖冲突。Conda是一个强大的包管理器和环境管理器。

1.1 创建新环境

首先,确保你已经安装了Anaconda或Miniconda。在开发机上已经安装好了conda,大家可以直接使用。创建虚拟环境时我们主要需要设置两个参数,一是虚拟环境的名字,二是python的版本。

conda create --name myenv python=3.9

这将创建一个名为myenv的新环境,使用Python 3.9。 在安装包时会有一步二次确认,填y就行。

1.2 环境管理

要使用创建好的虚拟环境,我们需要先激活环境。激活我们刚刚创建的myenv环境的命令如下:

conda activate myenv

如果要退出环境,回到默认环境,命令为

conda deactivate

其他常见的虚拟环境管理命令还有

#查看当前设备上所有的虚拟环境
conda env list
#查看当前环境中安装了的所有包
conda list
#删除环境(比如要删除myenv)
conda env remove myenv

1.3 安装虚拟环境到指定目录

有时我们会遇到想将整个虚拟环境保存到制定目录来共享,比如在局域网内,或者在InternStudio的团队开发机间共享。此时我们可以把conda的虚拟环境创建到指定目录下。

只需要在创建环境时使用--prefix参数制定环境所在的文件夹即可,比如我们想在/root/envs/路径下创建刚刚我们创建过得myenv(只做演示,不用操作)。

conda create --prefix /root/envs/myenv python=3.9

其他操作就与直接在默认路径下创建新环境没有区别了。想要激活保存在制定目录下的conda虚拟环境也十分简单,直接将环境名替换成所在文件夹就行。

conda activate /root/envs/myenv

myenv这个文件夹里包含了整个虚拟环境,所以理论上将他直接拷贝到任意一台安装了conda的机器上都能直接激活使用,这也是在内网机器上做环境配置的一种效率较高的解决方案。

Ch2 使用pip安装Python三方依赖包

在Python开发中,安装和管理第三方包是日常任务。pip是Python官方的包管理工具,全称为“Python Package Installer”,用于方便地安装、升级和管理Python包。

2.1 使用pip安装包

注意在使用conda的时候,我们需要先激活我们要用的虚拟环境,再在激活的虚拟环境中,使用pip来安装包。pip安装包的命令为pip install

pip install <somepackage># 安装单个包,<somepackage>替换成你要安装的包名
pip install pandas numpy # 安装多个包,如panda和numpy
pip install numpy==2.0 # 指定版本安装
pip install numpy>=1.19,<2.0 # 使用版本范围安装

2.2 安装requirement.txt

如果你有一个包含所有依赖信息的requirements.txt文件,可以使用-r一次性安装所有依赖。requirements.txt在各种开源代码中经常可以看到,里面描述了运行该代码所需要的包和对应版本。

pip install -r requirements.txt

比如以下就是我们接下来会接触到的LLM部署框架lmdeploy的requirements.txt 的一部分(只做展示,大家不用自行安装)

accelerate>=0.29.3
mmengine-lite
numpy<2.0.0
openai
peft<=0.11.1
transformers
triton>=2.1.0,<=2.3.1;

2.3 安装到指定目录

为了节省大家的存储空间,本次实战营可以直接使用share目录下的conda环境,但share目录只有读权限,所以要安装额外的包时我们不能直接使用pip将包安装到对应环境中,需要安装到我们自己的目录下。

这时我们在使用pip的时候可以使用--target-t参数来指定安装目录,此时pip会将你需要安装的包安装到你指定的目录下。

这里我们用本次实战营最常用的环境/root/share/pre_envs/pytorch2.1.2cu12.1来举例。

# 首先激活环境
conda activate /root/share/pre_envs/pytorch2.1.2cu12.1
# 创建一个目录/root/myenvs,并将包安装到这个目录下
mkdir -p /root/myenvs
pip install <somepackage> --target /root/myenvs
# 注意这里也可以使用-r来安装requirements.txt
pip install -r requirements.txt --target /root/myenvs

要使用安装在指定目录的python包,可以在python脚本开头临时动态地将该路径加入python环境变量中去

importsys# 你要添加的目录路径 your_directory='/root/myenvs'# 检查该目录是否已经在 sys.path 中 ifyour_directorynotinsys.path: # 将目录添加到 sys.path sys.path.append(your_directory) # 现在你可以直接导入该目录中的模块了 # 例如:import your_module

Ch3 使用本地Vscode连接InternStudio开发机

3.1 使用SSH连接开发机

VSCode是由微软开发一款轻量级但功能强大的代码编辑器,开源且完全免费。它拥有丰富的插件生态系统、跨平台支持、以及内置的Git控制功能,为开发者提供了高效便捷的编码体验。

VScode下载地址:Visual Studio Code - Code Editing. Redefined

首先需要安装Remote-SSH插件,安装完成后进入Remote Explorer,在ssh目录下新建一个ssh链接。

Description of the imageDescription of the image
安装Remote-SSH 进入Remote Explorer

点击+号,此时会有弹窗提示输入SSH链接命令(具体请看下文),回车后选择要更新的SSH配置文件,默认选择第一个即可(如有需要也可新建一个SSH配置文件)。

Description of the imageDescription of the image
输入链接命令 选择默认配置文件

开发机的链接命令可以在开发机控制台对应开发机"SSH连接"找到,复制登录命令到vscode的弹窗中然后回车,vscode就会开始链接InternStudio的服务器,记得此时切回去复制一下ssh的密码,待会会用到。

Description of the image

在新的弹窗中将SSH密码粘贴进去然后回车。随后会弹窗让选择远程终端的类型,选择Linux即可,因为我们的开发机是Linux系统。

首次连接会进行一些初始化设置,可能会比较慢,请耐心等待。后续打开文件夹时可能会再次需要输入密码,建议保持开发机的控制台开启以备不时之需。

当界面左下角显示远程连接地址SSH:ssh.intern-ai.org.cn时,说明连接成功。此时,我们可以像在本地使用VSCode一样,在开发机上进行各种操作。

连接成功后我们打开远程连接的vscode的extensions,在远程开发机(SSH:SSH.INTERN-AI.ORG.CN) 上安装好python的插件,后面python debug会用到。也可以一键把我们本地vscode的插件安装到开发机上。

Description of the image
Description of the image

3.2如何在Vscode中打开终端

可以有两种常用的方法打开终端:

  1. 单击VSCode页面底部状态栏中的“终端”图标(通常显示为两个图标一个X和一个),可以快速打开VSCode的终端面板。
  2. 使用快捷键Ctrl+`(反引号,tab键上面那一个),也可以快速打开VSCode的终端面板。

TIPS:终端面板右上方的+可以新建一个TERMINAL。

Ch4 使用vscode连接开发机进行python debug

4.1 什么是debug?

当你刚开始学习Python编程时,可能会遇到代码不按预期运行的情况。这时,你就需要用到“debug”了。简单来说,“debug”就是能再程序中设置中断点并支持一行一行地运行代码,观测程序中变量的变化,然后找出并修正代码中的错误。而VSCode提供了一个非常方便的debug工具,可以帮助你更容易地找到和修复错误。

4.2 使用Vscode进行Python debug的流程

4.2.1 debug单个python文件

defrange_sum(start,end):
sum_res=0foriinrange(start,end):
sum_res+=ireturnsum_resif__name__=="__main__":
print(range_sum(1,10))

Step1.安装Python扩展

  • 打开VSCode,点击左侧扩展栏,搜索Python,并安装。

Step2配置调试

  • 打开你的Python文件,点击左侧活动栏的“运行和调试”图标。
  • 首次debug需要配置以下,点击“create a launch.json file”,选择python debugger后选择“Python File” config。
Description of the image
  • 可以直接编辑生成的launch.json文件,配置调试参数,比如添加config(Add Configuration)等。
Description of the image

新建python文件后我们如果想要运行,首先需要选择解释器。单击右下角的select interpreter,vsconde会自动扫描开发机上所有的python环境中的解释器。

Step3.设置断点

在代码行号旁边点击,可以添加一个红点,这就是断点(如果不能添加红点需要检查一下Python扩展是否已经正确安装)。当代码运行到这里时,它会停下来,这样你就可以检查变量的值、执行步骤等。接下来,我们在第4行的核心代码处打上断点。

Description of the image

Step4.启动debug

点击VSCode侧边栏的“Run and Debug”(运行和调试),选择调试配置后,点击绿色箭头(开始调试)按钮,或者按F5键。

Description of the image

Step5.查看变量

当代码在断点处停下来时,你可以查看和修改变量的值。在“Run and Debug”侧边栏的“Variables”(变量)部分,你可以看到当前作用域内的所有变量及其值。

Description of the image

Step6.单步执行代码

你可以使用顶部的debug面板的按钮来单步执行代码。这样,你可以逐行运行代码,并查看每行代码执行后的效果。

Description of the image

debug面板各按钮功能介绍:

  1. continue: 继续运行到下一个断点。

  2. step over: 单步跳过,可以理解为运行当前行代码,不进入具体的函数或者方法。

  3. step into: 单步进入。如果当前行代码存在函数调用,则进入该函数内部。如果当前行代码没有函数调用,则等价于step over

  4. step out: 单步退出函数,返回到调用该函数的上一层代码。

  5. restart: 重新启动调试。

  6. stop: 终止调试。

Step7.修复错误并重新运行

如果你找到了代码中的错误,可以修复它,然后重新运行debug来确保问题已经被解决。

通过遵循以上步骤,你可以使用VSCode的debug功能来更容易地找到和修复你Python代码中的错误。可以自己编写一个简单的python脚本,并尝试使用debug来更好的理解代码的运行逻辑。记住,debug是编程中非常重要的一部分,所以不要怕花时间在这上面。随着时间的推移,你会变得越来越擅长它!

4.2.2 不同的断点

在调试(Debug)过程中,断点(Breakpoint)允许程序员在程序的执行流程中设置暂停点。当程序运行到这些断点时,执行会暂时中断,使得我们可以检查此时程序的状态,包括变量的值、内存的内容等。断点为我们提供了一个观察程序运行细节的机会,从而帮助我们定位和解决程序中的错误或问题。在VSCode中,我们还可以设置条件断点,这样断点只有在满足特定条件时才会触发。

  1. 普通断点:在代码行号左侧点击,添加断点。
  2. 条件断点:在断点标记上右键,选择条件断点(conditional breakpoint)。VSCode 中常用的条件断点主要有三种类型:
    1. 表达式(Expression):输入一个 Python 表达式,每次触发断点时运行该表达式,当表达式的值为 True 时 VS Code 会暂停执行。例如:x == 10
    2. 触发计数(Hit Count):断点触发计数达到输入值时才会暂停运行。
    3. 记录日志(Log Message):触发该断点时在 Debug Console 中输出指定信息,实际上就是 logpoint。需要输入要输出的信息,如果要用到表达式,可以使用 {} 将表达式括起来。例如,每次记录变量 i 的值可以写 x={i}

表达式条件断点

比如我们想让代码在 i=end-1 时停下来,可以这样设置: 在断点处右键选择“条件断点”,然后输入条件 i == end-1

Description of the image

回车保存断点,然后运行debug,可以看到程序在i=9的时候停了下来,此时各变量的值如下

Description of the image

触发计数条件断点

如果我们想让sum_res+=i在运行5次后停下来,我们可以在这行设置Hit count断点为5。

Description of the image

运行debug后,程序第一次暂停时各变量的状态为

Description of the image

记录日志条件断点

在Log Message输入 Current i is {i} 每次触发时记录一下 i 的值

Description of the image

运行debug后我们可以在终端面板的debug console看到

Description of the image

4.3 在vscode使用命令行进行debug

很多时候我们要debug的不止是一个简单的python文件,而是很多参数,参数中不止会有简单的值还可能有错综复杂的文件关系,甚至debug一整个项目。这种情况下,直接使用命令行来发起debug会是一个更好的选择。

4.3.1 vscode设置

vscode支持通过remote的方法连接我们在命令行中发起的debug server。首先我们要配置一下debug的config。

还是点击VSCode侧边栏的“Run and Debug”(运行和调试),单击"create a lauch.json file"

选择debugger时选择python debuger。选择debug config时选择remote attach就行,随后会让我们选择debug server的地址,因为我们是在本地debug,所以全都保持默认直接回车就可以了,也就是我们的server地址为 localhost:5678

Description of the image

配置完以后会打开配置的json文件,但这不是重点,可以关掉。这时我们会看到run and debug界面有变化,出现了debug选项。

Description of the image

4.3.2 debug命令行

现在vscode已经准备就绪,让我们来看看如何在命令行中发起debug。如果没有安装debugpy的话可以先通过pip install debugpy安装一下。

python -m debugpy --listen 5678 --wait-for-client ./myscript.py
  • ./myscript.py可以替换为我们想要debug的python文件,后面可以和直接在命令行中启动python一样跟上输入的参数。记得要先在想要debug的python文件打好断点并保存。

  • --wait-for-client参数会让我们的debug server在等客户端连入后才开始运行debug。在这就是要等到我们在run and debug界面启动debug。

先在终端中发起debug server,然后再去vscode debug页面单击一下绿色箭头开启debug。

Description of the image

接下来的操作就和上面一样了。

4.3.3 使用别名简化命令

这边有个不方便的地方,python -m debugpy --listen 5678 --wait-for-client这个命令太长了,每次都打很麻烦。这里我们可以给这段常用的命令设置一个别名。

linux系统中,可以对 ~/.bashrc 文件中添加以下命令

alias pyd='python -m debugpy --wait-for-client --listen 5678'

然后执行

source~/.bashrc

这样之后使用 pyd 命令(你可以自己命名) 替代 python 就能在命令行中起debug了,之前的debug命令就变成了

pyd ./myscript.py

Ch5 Python调用InternLM api

5.1 如何获取api key

前往书生浦语的API文档,登陆后点击API tokens。初次使用可能会需要先填写邀请码。

Description of the image

然后创建一个新的api token。

Description of the image
Description of the image

这里一定要注意,浦语的token只有刚创建的时候才能看到全文,后续没法再查看已经创建好的token,如果忘记需要重新创建,所以创建完了以后记得先复制保存到本地。

5.2 如何使用InternLM api

我们可以使用openai python sdk来调用InternLM api。注意在配置api key时,更推荐使用环境变量来配置以避免token泄露。

#./internlm_test.pyfromopenaiimportOpenAIimportosdefinternlm_gen(prompt,client):
''' LLM生成函数 Param prompt: prompt string Param client: OpenAI client  '''response=client.chat.completions.create(
model="internlm2.5-latest",
messages=[
{"role": "user", "content": prompt},
],
stream=False
)
returnresponse.choices[0].message.contentapi_key=os.getenv('api_key')
#api_key = "" #也可以明文写在代码内,不推荐client=OpenAI(base_url="https://internlm-chat.intern-ai.org.cn/puyu/api/v1/",api_key=api_key)
prompt='''你好!你是谁?'''response=internlm_gen(prompt,client)
print(response)

我们可以在终端中临时将token加入变量,此时该环境变量只在当前终端内有效。所以该种方法需要我们在该终端中运行我们的py脚本。

export api_key="填入你的api token"
python internlm_test.py

若是想永久加入环境变量,可以对 ~/.bashrc 文件中添加以下命令。

export api_key="填入你的api token"

保存后记得source ~/.bashrc

运行效果如下:

Description of the image

Ch6: Python基础

本课程也提供一个简易的Python基础教程(内容较多,请前往python_intro.md浏览)。

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

History

Folders and files

NameName
Last commit message
Last commit date

parent directory

..

readme.md

Python

B站封面

Intro

欢迎来到书生浦语大模型实战营基础部分Python关卡,本关主要由以下四大块内容组成:

  • Conda虚拟环境
  • pip安装三方依赖包
  • VScode中的Python Debug
  • 调用InternLM API
  • Python基础语法

学习完成后,完成以下两个任务并经过助教批改视为闯关成功

任务类型任务内容预计耗时
闯关任务Leetcode 38315mins
闯关任务Vscode连接InternStudio debug笔记15mins

任务具体描述见task.md

TIPS:本关内容覆盖较多,知识点较杂,如果有不清楚或者不懂的地方可以随时提问。同时如果觉得教程有问题的地方也请随时提出,让我们一起把本教程优化得更好,帮助更多的人走进大模型的世界。

Ch1 Conda虚拟环境

虚拟环境是Python开发中不可或缺的一部分,它允许你在不同的项目中使用不同版本的库,避免依赖冲突。Conda是一个强大的包管理器和环境管理器。

1.1 创建新环境

首先,确保你已经安装了Anaconda或Miniconda。在开发机上已经安装好了conda,大家可以直接使用。创建虚拟环境时我们主要需要设置两个参数,一是虚拟环境的名字,二是python的版本。

conda create --name myenv python=3.9

这将创建一个名为myenv的新环境,使用Python 3.9。 在安装包时会有一步二次确认,填y就行。

1.2 环境管理

要使用创建好的虚拟环境,我们需要先激活环境。激活我们刚刚创建的myenv环境的命令如下:

conda activate myenv

如果要退出环境,回到默认环境,命令为

conda deactivate

其他常见的虚拟环境管理命令还有

#查看当前设备上所有的虚拟环境
conda env list
#查看当前环境中安装了的所有包
conda list
#删除环境(比如要删除myenv)
conda env remove myenv

1.3 安装虚拟环境到指定目录

有时我们会遇到想将整个虚拟环境保存到制定目录来共享,比如在局域网内,或者在InternStudio的团队开发机间共享。此时我们可以把conda的虚拟环境创建到指定目录下。

只需要在创建环境时使用--prefix参数制定环境所在的文件夹即可,比如我们想在/root/envs/路径下创建刚刚我们创建过得myenv(只做演示,不用操作)。

conda create --prefix /root/envs/myenv python=3.9

其他操作就与直接在默认路径下创建新环境没有区别了。想要激活保存在制定目录下的conda虚拟环境也十分简单,直接将环境名替换成所在文件夹就行。

conda activate /root/envs/myenv

myenv这个文件夹里包含了整个虚拟环境,所以理论上将他直接拷贝到任意一台安装了conda的机器上都能直接激活使用,这也是在内网机器上做环境配置的一种效率较高的解决方案。

Ch2 使用pip安装Python三方依赖包

在Python开发中,安装和管理第三方包是日常任务。pip是Python官方的包管理工具,全称为“Python Package Installer”,用于方便地安装、升级和管理Python包。

2.1 使用pip安装包

注意在使用conda的时候,我们需要先激活我们要用的虚拟环境,再在激活的虚拟环境中,使用pip来安装包。pip安装包的命令为pip install

pip install <somepackage># 安装单个包,<somepackage>替换成你要安装的包名
pip install pandas numpy # 安装多个包,如panda和numpy
pip install numpy==2.0 # 指定版本安装
pip install numpy>=1.19,<2.0 # 使用版本范围安装

2.2 安装requirement.txt

如果你有一个包含所有依赖信息的requirements.txt文件,可以使用-r一次性安装所有依赖。requirements.txt在各种开源代码中经常可以看到,里面描述了运行该代码所需要的包和对应版本。

pip install -r requirements.txt

比如以下就是我们接下来会接触到的LLM部署框架lmdeploy的requirements.txt 的一部分(只做展示,大家不用自行安装)

accelerate>=0.29.3
mmengine-lite
numpy<2.0.0
openai
peft<=0.11.1
transformers
triton>=2.1.0,<=2.3.1;

2.3 安装到指定目录

为了节省大家的存储空间,本次实战营可以直接使用share目录下的conda环境,但share目录只有读权限,所以要安装额外的包时我们不能直接使用pip将包安装到对应环境中,需要安装到我们自己的目录下。

这时我们在使用pip的时候可以使用--target-t参数来指定安装目录,此时pip会将你需要安装的包安装到你指定的目录下。

这里我们用本次实战营最常用的环境/root/share/pre_envs/pytorch2.1.2cu12.1来举例。

# 首先激活环境
conda activate /root/share/pre_envs/pytorch2.1.2cu12.1
# 创建一个目录/root/myenvs,并将包安装到这个目录下
mkdir -p /root/myenvs
pip install <somepackage> --target /root/myenvs
# 注意这里也可以使用-r来安装requirements.txt
pip install -r requirements.txt --target /root/myenvs

要使用安装在指定目录的python包,可以在python脚本开头临时动态地将该路径加入python环境变量中去

importsys# 你要添加的目录路径 your_directory='/root/myenvs'# 检查该目录是否已经在 sys.path 中 ifyour_directorynotinsys.path: # 将目录添加到 sys.path sys.path.append(your_directory) # 现在你可以直接导入该目录中的模块了 # 例如:import your_module

Ch3 使用本地Vscode连接InternStudio开发机

3.1 使用SSH连接开发机

VSCode是由微软开发一款轻量级但功能强大的代码编辑器,开源且完全免费。它拥有丰富的插件生态系统、跨平台支持、以及内置的Git控制功能,为开发者提供了高效便捷的编码体验。

VScode下载地址:Visual Studio Code - Code Editing. Redefined

首先需要安装Remote-SSH插件,安装完成后进入Remote Explorer,在ssh目录下新建一个ssh链接。

Description of the imageDescription of the image
安装Remote-SSH 进入Remote Explorer

点击+号,此时会有弹窗提示输入SSH链接命令(具体请看下文),回车后选择要更新的SSH配置文件,默认选择第一个即可(如有需要也可新建一个SSH配置文件)。

Description of the imageDescription of the image
输入链接命令 选择默认配置文件

开发机的链接命令可以在开发机控制台对应开发机"SSH连接"找到,复制登录命令到vscode的弹窗中然后回车,vscode就会开始链接InternStudio的服务器,记得此时切回去复制一下ssh的密码,待会会用到。

Description of the image

在新的弹窗中将SSH密码粘贴进去然后回车。随后会弹窗让选择远程终端的类型,选择Linux即可,因为我们的开发机是Linux系统。

首次连接会进行一些初始化设置,可能会比较慢,请耐心等待。后续打开文件夹时可能会再次需要输入密码,建议保持开发机的控制台开启以备不时之需。

当界面左下角显示远程连接地址SSH:ssh.intern-ai.org.cn时,说明连接成功。此时,我们可以像在本地使用VSCode一样,在开发机上进行各种操作。

连接成功后我们打开远程连接的vscode的extensions,在远程开发机(SSH:SSH.INTERN-AI.ORG.CN) 上安装好python的插件,后面python debug会用到。也可以一键把我们本地vscode的插件安装到开发机上。

Description of the image
Description of the image

3.2如何在Vscode中打开终端

可以有两种常用的方法打开终端:

  1. 单击VSCode页面底部状态栏中的“终端”图标(通常显示为两个图标一个X和一个),可以快速打开VSCode的终端面板。
  2. 使用快捷键Ctrl+`(反引号,tab键上面那一个),也可以快速打开VSCode的终端面板。

TIPS:终端面板右上方的+可以新建一个TERMINAL。

Ch4 使用vscode连接开发机进行python debug

4.1 什么是debug?

当你刚开始学习Python编程时,可能会遇到代码不按预期运行的情况。这时,你就需要用到“debug”了。简单来说,“debug”就是能再程序中设置中断点并支持一行一行地运行代码,观测程序中变量的变化,然后找出并修正代码中的错误。而VSCode提供了一个非常方便的debug工具,可以帮助你更容易地找到和修复错误。

4.2 使用Vscode进行Python debug的流程

4.2.1 debug单个python文件

defrange_sum(start,end):
sum_res=0foriinrange(start,end):
sum_res+=ireturnsum_resif__name__=="__main__":
print(range_sum(1,10))

Step1.安装Python扩展

  • 打开VSCode,点击左侧扩展栏,搜索Python,并安装。

Step2配置调试

  • 打开你的Python文件,点击左侧活动栏的“运行和调试”图标。
  • 首次debug需要配置以下,点击“create a launch.json file”,选择python debugger后选择“Python File” config。
Description of the image
  • 可以直接编辑生成的launch.json文件,配置调试参数,比如添加config(Add Configuration)等。
Description of the image

新建python文件后我们如果想要运行,首先需要选择解释器。单击右下角的select interpreter,vsconde会自动扫描开发机上所有的python环境中的解释器。

Step3.设置断点

在代码行号旁边点击,可以添加一个红点,这就是断点(如果不能添加红点需要检查一下Python扩展是否已经正确安装)。当代码运行到这里时,它会停下来,这样你就可以检查变量的值、执行步骤等。接下来,我们在第4行的核心代码处打上断点。

Description of the image

Step4.启动debug

点击VSCode侧边栏的“Run and Debug”(运行和调试),选择调试配置后,点击绿色箭头(开始调试)按钮,或者按F5键。

Description of the image

Step5.查看变量

当代码在断点处停下来时,你可以查看和修改变量的值。在“Run and Debug”侧边栏的“Variables”(变量)部分,你可以看到当前作用域内的所有变量及其值。

Description of the image

Step6.单步执行代码

你可以使用顶部的debug面板的按钮来单步执行代码。这样,你可以逐行运行代码,并查看每行代码执行后的效果。

Description of the image

debug面板各按钮功能介绍:

  1. continue: 继续运行到下一个断点。

  2. step over: 单步跳过,可以理解为运行当前行代码,不进入具体的函数或者方法。

  3. step into: 单步进入。如果当前行代码存在函数调用,则进入该函数内部。如果当前行代码没有函数调用,则等价于step over

  4. step out: 单步退出函数,返回到调用该函数的上一层代码。

  5. restart: 重新启动调试。

  6. stop: 终止调试。

Step7.修复错误并重新运行

如果你找到了代码中的错误,可以修复它,然后重新运行debug来确保问题已经被解决。

通过遵循以上步骤,你可以使用VSCode的debug功能来更容易地找到和修复你Python代码中的错误。可以自己编写一个简单的python脚本,并尝试使用debug来更好的理解代码的运行逻辑。记住,debug是编程中非常重要的一部分,所以不要怕花时间在这上面。随着时间的推移,你会变得越来越擅长它!

4.2.2 不同的断点

在调试(Debug)过程中,断点(Breakpoint)允许程序员在程序的执行流程中设置暂停点。当程序运行到这些断点时,执行会暂时中断,使得我们可以检查此时程序的状态,包括变量的值、内存的内容等。断点为我们提供了一个观察程序运行细节的机会,从而帮助我们定位和解决程序中的错误或问题。在VSCode中,我们还可以设置条件断点,这样断点只有在满足特定条件时才会触发。

  1. 普通断点:在代码行号左侧点击,添加断点。
  2. 条件断点:在断点标记上右键,选择条件断点(conditional breakpoint)。VSCode 中常用的条件断点主要有三种类型:
    1. 表达式(Expression):输入一个 Python 表达式,每次触发断点时运行该表达式,当表达式的值为 True 时 VS Code 会暂停执行。例如:x == 10
    2. 触发计数(Hit Count):断点触发计数达到输入值时才会暂停运行。
    3. 记录日志(Log Message):触发该断点时在 Debug Console 中输出指定信息,实际上就是 logpoint。需要输入要输出的信息,如果要用到表达式,可以使用 {} 将表达式括起来。例如,每次记录变量 i 的值可以写 x={i}

表达式条件断点

比如我们想让代码在 i=end-1 时停下来,可以这样设置: 在断点处右键选择“条件断点”,然后输入条件 i == end-1

Description of the image

回车保存断点,然后运行debug,可以看到程序在i=9的时候停了下来,此时各变量的值如下

Description of the image

触发计数条件断点

如果我们想让sum_res+=i在运行5次后停下来,我们可以在这行设置Hit count断点为5。

Description of the image

运行debug后,程序第一次暂停时各变量的状态为

Description of the image

记录日志条件断点

在Log Message输入 Current i is {i} 每次触发时记录一下 i 的值

Description of the image

运行debug后我们可以在终端面板的debug console看到

Description of the image

4.3 在vscode使用命令行进行debug

很多时候我们要debug的不止是一个简单的python文件,而是很多参数,参数中不止会有简单的值还可能有错综复杂的文件关系,甚至debug一整个项目。这种情况下,直接使用命令行来发起debug会是一个更好的选择。

4.3.1 vscode设置

vscode支持通过remote的方法连接我们在命令行中发起的debug server。首先我们要配置一下debug的config。

还是点击VSCode侧边栏的“Run and Debug”(运行和调试),单击"create a lauch.json file"

选择debugger时选择python debuger。选择debug config时选择remote attach就行,随后会让我们选择debug server的地址,因为我们是在本地debug,所以全都保持默认直接回车就可以了,也就是我们的server地址为 localhost:5678

Description of the image

配置完以后会打开配置的json文件,但这不是重点,可以关掉。这时我们会看到run and debug界面有变化,出现了debug选项。

Description of the image

4.3.2 debug命令行

现在vscode已经准备就绪,让我们来看看如何在命令行中发起debug。如果没有安装debugpy的话可以先通过pip install debugpy安装一下。

python -m debugpy --listen 5678 --wait-for-client ./myscript.py
  • ./myscript.py可以替换为我们想要debug的python文件,后面可以和直接在命令行中启动python一样跟上输入的参数。记得要先在想要debug的python文件打好断点并保存。

  • --wait-for-client参数会让我们的debug server在等客户端连入后才开始运行debug。在这就是要等到我们在run and debug界面启动debug。

先在终端中发起debug server,然后再去vscode debug页面单击一下绿色箭头开启debug。

Description of the image

接下来的操作就和上面一样了。

4.3.3 使用别名简化命令

这边有个不方便的地方,python -m debugpy --listen 5678 --wait-for-client这个命令太长了,每次都打很麻烦。这里我们可以给这段常用的命令设置一个别名。

linux系统中,可以对 ~/.bashrc 文件中添加以下命令

alias pyd='python -m debugpy --wait-for-client --listen 5678'

然后执行

source~/.bashrc

这样之后使用 pyd 命令(你可以自己命名) 替代 python 就能在命令行中起debug了,之前的debug命令就变成了

pyd ./myscript.py

Ch5 Python调用InternLM api

5.1 如何获取api key

前往书生浦语的API文档,登陆后点击API tokens。初次使用可能会需要先填写邀请码。

Description of the image

然后创建一个新的api token。

Description of the image
Description of the image

这里一定要注意,浦语的token只有刚创建的时候才能看到全文,后续没法再查看已经创建好的token,如果忘记需要重新创建,所以创建完了以后记得先复制保存到本地。

5.2 如何使用InternLM api

我们可以使用openai python sdk来调用InternLM api。注意在配置api key时,更推荐使用环境变量来配置以避免token泄露。

#./internlm_test.pyfromopenaiimportOpenAIimportosdefinternlm_gen(prompt,client):
''' LLM生成函数 Param prompt: prompt string Param client: OpenAI client  '''response=client.chat.completions.create(
model="internlm2.5-latest",
messages=[
{"role": "user", "content": prompt},
],
stream=False
)
returnresponse.choices[0].message.contentapi_key=os.getenv('api_key')
#api_key = "" #也可以明文写在代码内,不推荐client=OpenAI(base_url="https://internlm-chat.intern-ai.org.cn/puyu/api/v1/",api_key=api_key)
prompt='''你好!你是谁?'''response=internlm_gen(prompt,client)
print(response)

我们可以在终端中临时将token加入变量,此时该环境变量只在当前终端内有效。所以该种方法需要我们在该终端中运行我们的py脚本。

export api_key="填入你的api token"
python internlm_test.py

若是想永久加入环境变量,可以对 ~/.bashrc 文件中添加以下命令。

export api_key="填入你的api token"

保存后记得source ~/.bashrc

运行效果如下:

Description of the image

Ch6: Python基础

本课程也提供一个简易的Python基础教程(内容较多,请前往python_intro.md浏览)。

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

History

Folders and files

NameName
Last commit message
Last commit date

parent directory

..

readme.md

Python

B站封面

Intro

欢迎来到书生浦语大模型实战营基础部分Python关卡,本关主要由以下四大块内容组成:

  • Conda虚拟环境
  • pip安装三方依赖包
  • VScode中的Python Debug
  • 调用InternLM API
  • Python基础语法

学习完成后,完成以下两个任务并经过助教批改视为闯关成功

任务类型任务内容预计耗时
闯关任务Leetcode 38315mins
闯关任务Vscode连接InternStudio debug笔记15mins

任务具体描述见task.md

TIPS:本关内容覆盖较多,知识点较杂,如果有不清楚或者不懂的地方可以随时提问。同时如果觉得教程有问题的地方也请随时提出,让我们一起把本教程优化得更好,帮助更多的人走进大模型的世界。

Ch1 Conda虚拟环境

虚拟环境是Python开发中不可或缺的一部分,它允许你在不同的项目中使用不同版本的库,避免依赖冲突。Conda是一个强大的包管理器和环境管理器。

1.1 创建新环境

首先,确保你已经安装了Anaconda或Miniconda。在开发机上已经安装好了conda,大家可以直接使用。创建虚拟环境时我们主要需要设置两个参数,一是虚拟环境的名字,二是python的版本。

conda create --name myenv python=3.9

这将创建一个名为myenv的新环境,使用Python 3.9。 在安装包时会有一步二次确认,填y就行。

1.2 环境管理

要使用创建好的虚拟环境,我们需要先激活环境。激活我们刚刚创建的myenv环境的命令如下:

conda activate myenv

如果要退出环境,回到默认环境,命令为

conda deactivate

其他常见的虚拟环境管理命令还有

#查看当前设备上所有的虚拟环境
conda env list
#查看当前环境中安装了的所有包
conda list
#删除环境(比如要删除myenv)
conda env remove myenv

1.3 安装虚拟环境到指定目录

有时我们会遇到想将整个虚拟环境保存到制定目录来共享,比如在局域网内,或者在InternStudio的团队开发机间共享。此时我们可以把conda的虚拟环境创建到指定目录下。

只需要在创建环境时使用--prefix参数制定环境所在的文件夹即可,比如我们想在/root/envs/路径下创建刚刚我们创建过得myenv(只做演示,不用操作)。

conda create --prefix /root/envs/myenv python=3.9

其他操作就与直接在默认路径下创建新环境没有区别了。想要激活保存在制定目录下的conda虚拟环境也十分简单,直接将环境名替换成所在文件夹就行。

conda activate /root/envs/myenv

myenv这个文件夹里包含了整个虚拟环境,所以理论上将他直接拷贝到任意一台安装了conda的机器上都能直接激活使用,这也是在内网机器上做环境配置的一种效率较高的解决方案。

Ch2 使用pip安装Python三方依赖包

在Python开发中,安装和管理第三方包是日常任务。pip是Python官方的包管理工具,全称为“Python Package Installer”,用于方便地安装、升级和管理Python包。

2.1 使用pip安装包

注意在使用conda的时候,我们需要先激活我们要用的虚拟环境,再在激活的虚拟环境中,使用pip来安装包。pip安装包的命令为pip install

pip install <somepackage># 安装单个包,<somepackage>替换成你要安装的包名
pip install pandas numpy # 安装多个包,如panda和numpy
pip install numpy==2.0 # 指定版本安装
pip install numpy>=1.19,<2.0 # 使用版本范围安装

2.2 安装requirement.txt

如果你有一个包含所有依赖信息的requirements.txt文件,可以使用-r一次性安装所有依赖。requirements.txt在各种开源代码中经常可以看到,里面描述了运行该代码所需要的包和对应版本。

pip install -r requirements.txt

比如以下就是我们接下来会接触到的LLM部署框架lmdeploy的requirements.txt 的一部分(只做展示,大家不用自行安装)

accelerate>=0.29.3
mmengine-lite
numpy<2.0.0
openai
peft<=0.11.1
transformers
triton>=2.1.0,<=2.3.1;

2.3 安装到指定目录

为了节省大家的存储空间,本次实战营可以直接使用share目录下的conda环境,但share目录只有读权限,所以要安装额外的包时我们不能直接使用pip将包安装到对应环境中,需要安装到我们自己的目录下。

这时我们在使用pip的时候可以使用--target-t参数来指定安装目录,此时pip会将你需要安装的包安装到你指定的目录下。

这里我们用本次实战营最常用的环境/root/share/pre_envs/pytorch2.1.2cu12.1来举例。

# 首先激活环境
conda activate /root/share/pre_envs/pytorch2.1.2cu12.1
# 创建一个目录/root/myenvs,并将包安装到这个目录下
mkdir -p /root/myenvs
pip install <somepackage> --target /root/myenvs
# 注意这里也可以使用-r来安装requirements.txt
pip install -r requirements.txt --target /root/myenvs

要使用安装在指定目录的python包,可以在python脚本开头临时动态地将该路径加入python环境变量中去

importsys# 你要添加的目录路径 your_directory='/root/myenvs'# 检查该目录是否已经在 sys.path 中 ifyour_directorynotinsys.path: # 将目录添加到 sys.path sys.path.append(your_directory) # 现在你可以直接导入该目录中的模块了 # 例如:import your_module

Ch3 使用本地Vscode连接InternStudio开发机

3.1 使用SSH连接开发机

VSCode是由微软开发一款轻量级但功能强大的代码编辑器,开源且完全免费。它拥有丰富的插件生态系统、跨平台支持、以及内置的Git控制功能,为开发者提供了高效便捷的编码体验。

VScode下载地址:Visual Studio Code - Code Editing. Redefined

首先需要安装Remote-SSH插件,安装完成后进入Remote Explorer,在ssh目录下新建一个ssh链接。

Description of the imageDescription of the image
安装Remote-SSH 进入Remote Explorer

点击+号,此时会有弹窗提示输入SSH链接命令(具体请看下文),回车后选择要更新的SSH配置文件,默认选择第一个即可(如有需要也可新建一个SSH配置文件)。

Description of the imageDescription of the image
输入链接命令 选择默认配置文件

开发机的链接命令可以在开发机控制台对应开发机"SSH连接"找到,复制登录命令到vscode的弹窗中然后回车,vscode就会开始链接InternStudio的服务器,记得此时切回去复制一下ssh的密码,待会会用到。

Description of the image

在新的弹窗中将SSH密码粘贴进去然后回车。随后会弹窗让选择远程终端的类型,选择Linux即可,因为我们的开发机是Linux系统。

首次连接会进行一些初始化设置,可能会比较慢,请耐心等待。后续打开文件夹时可能会再次需要输入密码,建议保持开发机的控制台开启以备不时之需。

当界面左下角显示远程连接地址SSH:ssh.intern-ai.org.cn时,说明连接成功。此时,我们可以像在本地使用VSCode一样,在开发机上进行各种操作。

连接成功后我们打开远程连接的vscode的extensions,在远程开发机(SSH:SSH.INTERN-AI.ORG.CN) 上安装好python的插件,后面python debug会用到。也可以一键把我们本地vscode的插件安装到开发机上。

Description of the image
Description of the image

3.2如何在Vscode中打开终端

可以有两种常用的方法打开终端:

  1. 单击VSCode页面底部状态栏中的“终端”图标(通常显示为两个图标一个X和一个),可以快速打开VSCode的终端面板。
  2. 使用快捷键Ctrl+`(反引号,tab键上面那一个),也可以快速打开VSCode的终端面板。

TIPS:终端面板右上方的+可以新建一个TERMINAL。

Ch4 使用vscode连接开发机进行python debug

4.1 什么是debug?

当你刚开始学习Python编程时,可能会遇到代码不按预期运行的情况。这时,你就需要用到“debug”了。简单来说,“debug”就是能再程序中设置中断点并支持一行一行地运行代码,观测程序中变量的变化,然后找出并修正代码中的错误。而VSCode提供了一个非常方便的debug工具,可以帮助你更容易地找到和修复错误。

4.2 使用Vscode进行Python debug的流程

4.2.1 debug单个python文件

defrange_sum(start,end):
sum_res=0foriinrange(start,end):
sum_res+=ireturnsum_resif__name__=="__main__":
print(range_sum(1,10))

Step1.安装Python扩展

  • 打开VSCode,点击左侧扩展栏,搜索Python,并安装。

Step2配置调试

  • 打开你的Python文件,点击左侧活动栏的“运行和调试”图标。
  • 首次debug需要配置以下,点击“create a launch.json file”,选择python debugger后选择“Python File” config。
Description of the image
  • 可以直接编辑生成的launch.json文件,配置调试参数,比如添加config(Add Configuration)等。
Description of the image

新建python文件后我们如果想要运行,首先需要选择解释器。单击右下角的select interpreter,vsconde会自动扫描开发机上所有的python环境中的解释器。

Step3.设置断点

在代码行号旁边点击,可以添加一个红点,这就是断点(如果不能添加红点需要检查一下Python扩展是否已经正确安装)。当代码运行到这里时,它会停下来,这样你就可以检查变量的值、执行步骤等。接下来,我们在第4行的核心代码处打上断点。

Description of the image

Step4.启动debug

点击VSCode侧边栏的“Run and Debug”(运行和调试),选择调试配置后,点击绿色箭头(开始调试)按钮,或者按F5键。

Description of the image

Step5.查看变量

当代码在断点处停下来时,你可以查看和修改变量的值。在“Run and Debug”侧边栏的“Variables”(变量)部分,你可以看到当前作用域内的所有变量及其值。

Description of the image

Step6.单步执行代码

你可以使用顶部的debug面板的按钮来单步执行代码。这样,你可以逐行运行代码,并查看每行代码执行后的效果。

Description of the image

debug面板各按钮功能介绍:

  1. continue: 继续运行到下一个断点。

  2. step over: 单步跳过,可以理解为运行当前行代码,不进入具体的函数或者方法。

  3. step into: 单步进入。如果当前行代码存在函数调用,则进入该函数内部。如果当前行代码没有函数调用,则等价于step over

  4. step out: 单步退出函数,返回到调用该函数的上一层代码。

  5. restart: 重新启动调试。

  6. stop: 终止调试。

Step7.修复错误并重新运行

如果你找到了代码中的错误,可以修复它,然后重新运行debug来确保问题已经被解决。

通过遵循以上步骤,你可以使用VSCode的debug功能来更容易地找到和修复你Python代码中的错误。可以自己编写一个简单的python脚本,并尝试使用debug来更好的理解代码的运行逻辑。记住,debug是编程中非常重要的一部分,所以不要怕花时间在这上面。随着时间的推移,你会变得越来越擅长它!

4.2.2 不同的断点

在调试(Debug)过程中,断点(Breakpoint)允许程序员在程序的执行流程中设置暂停点。当程序运行到这些断点时,执行会暂时中断,使得我们可以检查此时程序的状态,包括变量的值、内存的内容等。断点为我们提供了一个观察程序运行细节的机会,从而帮助我们定位和解决程序中的错误或问题。在VSCode中,我们还可以设置条件断点,这样断点只有在满足特定条件时才会触发。

  1. 普通断点:在代码行号左侧点击,添加断点。
  2. 条件断点:在断点标记上右键,选择条件断点(conditional breakpoint)。VSCode 中常用的条件断点主要有三种类型:
    1. 表达式(Expression):输入一个 Python 表达式,每次触发断点时运行该表达式,当表达式的值为 True 时 VS Code 会暂停执行。例如:x == 10
    2. 触发计数(Hit Count):断点触发计数达到输入值时才会暂停运行。
    3. 记录日志(Log Message):触发该断点时在 Debug Console 中输出指定信息,实际上就是 logpoint。需要输入要输出的信息,如果要用到表达式,可以使用 {} 将表达式括起来。例如,每次记录变量 i 的值可以写 x={i}

表达式条件断点

比如我们想让代码在 i=end-1 时停下来,可以这样设置: 在断点处右键选择“条件断点”,然后输入条件 i == end-1

Description of the image

回车保存断点,然后运行debug,可以看到程序在i=9的时候停了下来,此时各变量的值如下

Description of the image

触发计数条件断点

如果我们想让sum_res+=i在运行5次后停下来,我们可以在这行设置Hit count断点为5。

Description of the image

运行debug后,程序第一次暂停时各变量的状态为

Description of the image

记录日志条件断点

在Log Message输入 Current i is {i} 每次触发时记录一下 i 的值

Description of the image

运行debug后我们可以在终端面板的debug console看到

Description of the image

4.3 在vscode使用命令行进行debug

很多时候我们要debug的不止是一个简单的python文件,而是很多参数,参数中不止会有简单的值还可能有错综复杂的文件关系,甚至debug一整个项目。这种情况下,直接使用命令行来发起debug会是一个更好的选择。

4.3.1 vscode设置

vscode支持通过remote的方法连接我们在命令行中发起的debug server。首先我们要配置一下debug的config。

还是点击VSCode侧边栏的“Run and Debug”(运行和调试),单击"create a lauch.json file"

选择debugger时选择python debuger。选择debug config时选择remote attach就行,随后会让我们选择debug server的地址,因为我们是在本地debug,所以全都保持默认直接回车就可以了,也就是我们的server地址为 localhost:5678

Description of the image

配置完以后会打开配置的json文件,但这不是重点,可以关掉。这时我们会看到run and debug界面有变化,出现了debug选项。

Description of the image

4.3.2 debug命令行

现在vscode已经准备就绪,让我们来看看如何在命令行中发起debug。如果没有安装debugpy的话可以先通过pip install debugpy安装一下。

python -m debugpy --listen 5678 --wait-for-client ./myscript.py
  • ./myscript.py可以替换为我们想要debug的python文件,后面可以和直接在命令行中启动python一样跟上输入的参数。记得要先在想要debug的python文件打好断点并保存。

  • --wait-for-client参数会让我们的debug server在等客户端连入后才开始运行debug。在这就是要等到我们在run and debug界面启动debug。

先在终端中发起debug server,然后再去vscode debug页面单击一下绿色箭头开启debug。

Description of the image

接下来的操作就和上面一样了。

4.3.3 使用别名简化命令

这边有个不方便的地方,python -m debugpy --listen 5678 --wait-for-client这个命令太长了,每次都打很麻烦。这里我们可以给这段常用的命令设置一个别名。

linux系统中,可以对 ~/.bashrc 文件中添加以下命令

alias pyd='python -m debugpy --wait-for-client --listen 5678'

然后执行

source~/.bashrc

这样之后使用 pyd 命令(你可以自己命名) 替代 python 就能在命令行中起debug了,之前的debug命令就变成了

pyd ./myscript.py

Ch5 Python调用InternLM api

5.1 如何获取api key

前往书生浦语的API文档,登陆后点击API tokens。初次使用可能会需要先填写邀请码。

Description of the image

然后创建一个新的api token。

Description of the image
Description of the image

这里一定要注意,浦语的token只有刚创建的时候才能看到全文,后续没法再查看已经创建好的token,如果忘记需要重新创建,所以创建完了以后记得先复制保存到本地。

5.2 如何使用InternLM api

我们可以使用openai python sdk来调用InternLM api。注意在配置api key时,更推荐使用环境变量来配置以避免token泄露。

#./internlm_test.pyfromopenaiimportOpenAIimportosdefinternlm_gen(prompt,client):
''' LLM生成函数 Param prompt: prompt string Param client: OpenAI client  '''response=client.chat.completions.create(
model="internlm2.5-latest",
messages=[
{"role": "user", "content": prompt},
],
stream=False
)
returnresponse.choices[0].message.contentapi_key=os.getenv('api_key')
#api_key = "" #也可以明文写在代码内,不推荐client=OpenAI(base_url="https://internlm-chat.intern-ai.org.cn/puyu/api/v1/",api_key=api_key)
prompt='''你好!你是谁?'''response=internlm_gen(prompt,client)
print(response)

我们可以在终端中临时将token加入变量,此时该环境变量只在当前终端内有效。所以该种方法需要我们在该终端中运行我们的py脚本。

export api_key="填入你的api token"
python internlm_test.py

若是想永久加入环境变量,可以对 ~/.bashrc 文件中添加以下命令。

export api_key="填入你的api token"

保存后记得source ~/.bashrc

运行效果如下:

Description of the image

Ch6: Python基础

本课程也提供一个简易的Python基础教程(内容较多,请前往python_intro.md浏览)。

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

History

Folders and files

NameName
Last commit message
Last commit date

parent directory

..

readme.md

Python

B站封面

Intro

欢迎来到书生浦语大模型实战营基础部分Python关卡,本关主要由以下四大块内容组成:

  • Conda虚拟环境
  • pip安装三方依赖包
  • VScode中的Python Debug
  • 调用InternLM API
  • Python基础语法

学习完成后,完成以下两个任务并经过助教批改视为闯关成功

任务类型任务内容预计耗时
闯关任务Leetcode 38315mins
闯关任务Vscode连接InternStudio debug笔记15mins

任务具体描述见task.md

TIPS:本关内容覆盖较多,知识点较杂,如果有不清楚或者不懂的地方可以随时提问。同时如果觉得教程有问题的地方也请随时提出,让我们一起把本教程优化得更好,帮助更多的人走进大模型的世界。

Ch1 Conda虚拟环境

虚拟环境是Python开发中不可或缺的一部分,它允许你在不同的项目中使用不同版本的库,避免依赖冲突。Conda是一个强大的包管理器和环境管理器。

1.1 创建新环境

首先,确保你已经安装了Anaconda或Miniconda。在开发机上已经安装好了conda,大家可以直接使用。创建虚拟环境时我们主要需要设置两个参数,一是虚拟环境的名字,二是python的版本。

conda create --name myenv python=3.9

这将创建一个名为myenv的新环境,使用Python 3.9。 在安装包时会有一步二次确认,填y就行。

1.2 环境管理

要使用创建好的虚拟环境,我们需要先激活环境。激活我们刚刚创建的myenv环境的命令如下:

conda activate myenv

如果要退出环境,回到默认环境,命令为

conda deactivate

其他常见的虚拟环境管理命令还有

#查看当前设备上所有的虚拟环境
conda env list
#查看当前环境中安装了的所有包
conda list
#删除环境(比如要删除myenv)
conda env remove myenv

1.3 安装虚拟环境到指定目录

有时我们会遇到想将整个虚拟环境保存到制定目录来共享,比如在局域网内,或者在InternStudio的团队开发机间共享。此时我们可以把conda的虚拟环境创建到指定目录下。

只需要在创建环境时使用--prefix参数制定环境所在的文件夹即可,比如我们想在/root/envs/路径下创建刚刚我们创建过得myenv(只做演示,不用操作)。

conda create --prefix /root/envs/myenv python=3.9

其他操作就与直接在默认路径下创建新环境没有区别了。想要激活保存在制定目录下的conda虚拟环境也十分简单,直接将环境名替换成所在文件夹就行。

conda activate /root/envs/myenv

myenv这个文件夹里包含了整个虚拟环境,所以理论上将他直接拷贝到任意一台安装了conda的机器上都能直接激活使用,这也是在内网机器上做环境配置的一种效率较高的解决方案。

Ch2 使用pip安装Python三方依赖包

在Python开发中,安装和管理第三方包是日常任务。pip是Python官方的包管理工具,全称为“Python Package Installer”,用于方便地安装、升级和管理Python包。

2.1 使用pip安装包

注意在使用conda的时候,我们需要先激活我们要用的虚拟环境,再在激活的虚拟环境中,使用pip来安装包。pip安装包的命令为pip install

pip install <somepackage># 安装单个包,<somepackage>替换成你要安装的包名
pip install pandas numpy # 安装多个包,如panda和numpy
pip install numpy==2.0 # 指定版本安装
pip install numpy>=1.19,<2.0 # 使用版本范围安装

2.2 安装requirement.txt

如果你有一个包含所有依赖信息的requirements.txt文件,可以使用-r一次性安装所有依赖。requirements.txt在各种开源代码中经常可以看到,里面描述了运行该代码所需要的包和对应版本。

pip install -r requirements.txt

比如以下就是我们接下来会接触到的LLM部署框架lmdeploy的requirements.txt 的一部分(只做展示,大家不用自行安装)

accelerate>=0.29.3
mmengine-lite
numpy<2.0.0
openai
peft<=0.11.1
transformers
triton>=2.1.0,<=2.3.1;

2.3 安装到指定目录

为了节省大家的存储空间,本次实战营可以直接使用share目录下的conda环境,但share目录只有读权限,所以要安装额外的包时我们不能直接使用pip将包安装到对应环境中,需要安装到我们自己的目录下。

这时我们在使用pip的时候可以使用--target-t参数来指定安装目录,此时pip会将你需要安装的包安装到你指定的目录下。

这里我们用本次实战营最常用的环境/root/share/pre_envs/pytorch2.1.2cu12.1来举例。

# 首先激活环境
conda activate /root/share/pre_envs/pytorch2.1.2cu12.1
# 创建一个目录/root/myenvs,并将包安装到这个目录下
mkdir -p /root/myenvs
pip install <somepackage> --target /root/myenvs
# 注意这里也可以使用-r来安装requirements.txt
pip install -r requirements.txt --target /root/myenvs

要使用安装在指定目录的python包,可以在python脚本开头临时动态地将该路径加入python环境变量中去

importsys# 你要添加的目录路径 your_directory='/root/myenvs'# 检查该目录是否已经在 sys.path 中 ifyour_directorynotinsys.path: # 将目录添加到 sys.path sys.path.append(your_directory) # 现在你可以直接导入该目录中的模块了 # 例如:import your_module

Ch3 使用本地Vscode连接InternStudio开发机

3.1 使用SSH连接开发机

VSCode是由微软开发一款轻量级但功能强大的代码编辑器,开源且完全免费。它拥有丰富的插件生态系统、跨平台支持、以及内置的Git控制功能,为开发者提供了高效便捷的编码体验。

VScode下载地址:Visual Studio Code - Code Editing. Redefined

首先需要安装Remote-SSH插件,安装完成后进入Remote Explorer,在ssh目录下新建一个ssh链接。

Description of the imageDescription of the image
安装Remote-SSH 进入Remote Explorer

点击+号,此时会有弹窗提示输入SSH链接命令(具体请看下文),回车后选择要更新的SSH配置文件,默认选择第一个即可(如有需要也可新建一个SSH配置文件)。

Description of the imageDescription of the image
输入链接命令 选择默认配置文件

开发机的链接命令可以在开发机控制台对应开发机"SSH连接"找到,复制登录命令到vscode的弹窗中然后回车,vscode就会开始链接InternStudio的服务器,记得此时切回去复制一下ssh的密码,待会会用到。

Description of the image

在新的弹窗中将SSH密码粘贴进去然后回车。随后会弹窗让选择远程终端的类型,选择Linux即可,因为我们的开发机是Linux系统。

首次连接会进行一些初始化设置,可能会比较慢,请耐心等待。后续打开文件夹时可能会再次需要输入密码,建议保持开发机的控制台开启以备不时之需。

当界面左下角显示远程连接地址SSH:ssh.intern-ai.org.cn时,说明连接成功。此时,我们可以像在本地使用VSCode一样,在开发机上进行各种操作。

连接成功后我们打开远程连接的vscode的extensions,在远程开发机(SSH:SSH.INTERN-AI.ORG.CN) 上安装好python的插件,后面python debug会用到。也可以一键把我们本地vscode的插件安装到开发机上。

Description of the image
Description of the image

3.2如何在Vscode中打开终端

可以有两种常用的方法打开终端:

  1. 单击VSCode页面底部状态栏中的“终端”图标(通常显示为两个图标一个X和一个),可以快速打开VSCode的终端面板。
  2. 使用快捷键Ctrl+`(反引号,tab键上面那一个),也可以快速打开VSCode的终端面板。

TIPS:终端面板右上方的+可以新建一个TERMINAL。

Ch4 使用vscode连接开发机进行python debug

4.1 什么是debug?

当你刚开始学习Python编程时,可能会遇到代码不按预期运行的情况。这时,你就需要用到“debug”了。简单来说,“debug”就是能再程序中设置中断点并支持一行一行地运行代码,观测程序中变量的变化,然后找出并修正代码中的错误。而VSCode提供了一个非常方便的debug工具,可以帮助你更容易地找到和修复错误。

4.2 使用Vscode进行Python debug的流程

4.2.1 debug单个python文件

defrange_sum(start,end):
sum_res=0foriinrange(start,end):
sum_res+=ireturnsum_resif__name__=="__main__":
print(range_sum(1,10))

Step1.安装Python扩展

  • 打开VSCode,点击左侧扩展栏,搜索Python,并安装。

Step2配置调试

  • 打开你的Python文件,点击左侧活动栏的“运行和调试”图标。
  • 首次debug需要配置以下,点击“create a launch.json file”,选择python debugger后选择“Python File” config。
Description of the image
  • 可以直接编辑生成的launch.json文件,配置调试参数,比如添加config(Add Configuration)等。
Description of the image

新建python文件后我们如果想要运行,首先需要选择解释器。单击右下角的select interpreter,vsconde会自动扫描开发机上所有的python环境中的解释器。

Step3.设置断点

在代码行号旁边点击,可以添加一个红点,这就是断点(如果不能添加红点需要检查一下Python扩展是否已经正确安装)。当代码运行到这里时,它会停下来,这样你就可以检查变量的值、执行步骤等。接下来,我们在第4行的核心代码处打上断点。

Description of the image

Step4.启动debug

点击VSCode侧边栏的“Run and Debug”(运行和调试),选择调试配置后,点击绿色箭头(开始调试)按钮,或者按F5键。

Description of the image

Step5.查看变量

当代码在断点处停下来时,你可以查看和修改变量的值。在“Run and Debug”侧边栏的“Variables”(变量)部分,你可以看到当前作用域内的所有变量及其值。

Description of the image

Step6.单步执行代码

你可以使用顶部的debug面板的按钮来单步执行代码。这样,你可以逐行运行代码,并查看每行代码执行后的效果。

Description of the image

debug面板各按钮功能介绍:

  1. continue: 继续运行到下一个断点。

  2. step over: 单步跳过,可以理解为运行当前行代码,不进入具体的函数或者方法。

  3. step into: 单步进入。如果当前行代码存在函数调用,则进入该函数内部。如果当前行代码没有函数调用,则等价于step over

  4. step out: 单步退出函数,返回到调用该函数的上一层代码。

  5. restart: 重新启动调试。

  6. stop: 终止调试。

Step7.修复错误并重新运行

如果你找到了代码中的错误,可以修复它,然后重新运行debug来确保问题已经被解决。

通过遵循以上步骤,你可以使用VSCode的debug功能来更容易地找到和修复你Python代码中的错误。可以自己编写一个简单的python脚本,并尝试使用debug来更好的理解代码的运行逻辑。记住,debug是编程中非常重要的一部分,所以不要怕花时间在这上面。随着时间的推移,你会变得越来越擅长它!

4.2.2 不同的断点

在调试(Debug)过程中,断点(Breakpoint)允许程序员在程序的执行流程中设置暂停点。当程序运行到这些断点时,执行会暂时中断,使得我们可以检查此时程序的状态,包括变量的值、内存的内容等。断点为我们提供了一个观察程序运行细节的机会,从而帮助我们定位和解决程序中的错误或问题。在VSCode中,我们还可以设置条件断点,这样断点只有在满足特定条件时才会触发。

  1. 普通断点:在代码行号左侧点击,添加断点。
  2. 条件断点:在断点标记上右键,选择条件断点(conditional breakpoint)。VSCode 中常用的条件断点主要有三种类型:
    1. 表达式(Expression):输入一个 Python 表达式,每次触发断点时运行该表达式,当表达式的值为 True 时 VS Code 会暂停执行。例如:x == 10
    2. 触发计数(Hit Count):断点触发计数达到输入值时才会暂停运行。
    3. 记录日志(Log Message):触发该断点时在 Debug Console 中输出指定信息,实际上就是 logpoint。需要输入要输出的信息,如果要用到表达式,可以使用 {} 将表达式括起来。例如,每次记录变量 i 的值可以写 x={i}

表达式条件断点

比如我们想让代码在 i=end-1 时停下来,可以这样设置: 在断点处右键选择“条件断点”,然后输入条件 i == end-1

Description of the image

回车保存断点,然后运行debug,可以看到程序在i=9的时候停了下来,此时各变量的值如下

Description of the image

触发计数条件断点

如果我们想让sum_res+=i在运行5次后停下来,我们可以在这行设置Hit count断点为5。

Description of the image

运行debug后,程序第一次暂停时各变量的状态为

Description of the image

记录日志条件断点

在Log Message输入 Current i is {i} 每次触发时记录一下 i 的值

Description of the image

运行debug后我们可以在终端面板的debug console看到

Description of the image

4.3 在vscode使用命令行进行debug

很多时候我们要debug的不止是一个简单的python文件,而是很多参数,参数中不止会有简单的值还可能有错综复杂的文件关系,甚至debug一整个项目。这种情况下,直接使用命令行来发起debug会是一个更好的选择。

4.3.1 vscode设置

vscode支持通过remote的方法连接我们在命令行中发起的debug server。首先我们要配置一下debug的config。

还是点击VSCode侧边栏的“Run and Debug”(运行和调试),单击"create a lauch.json file"

选择debugger时选择python debuger。选择debug config时选择remote attach就行,随后会让我们选择debug server的地址,因为我们是在本地debug,所以全都保持默认直接回车就可以了,也就是我们的server地址为 localhost:5678

Description of the image

配置完以后会打开配置的json文件,但这不是重点,可以关掉。这时我们会看到run and debug界面有变化,出现了debug选项。

Description of the image

4.3.2 debug命令行

现在vscode已经准备就绪,让我们来看看如何在命令行中发起debug。如果没有安装debugpy的话可以先通过pip install debugpy安装一下。

python -m debugpy --listen 5678 --wait-for-client ./myscript.py
  • ./myscript.py可以替换为我们想要debug的python文件,后面可以和直接在命令行中启动python一样跟上输入的参数。记得要先在想要debug的python文件打好断点并保存。

  • --wait-for-client参数会让我们的debug server在等客户端连入后才开始运行debug。在这就是要等到我们在run and debug界面启动debug。

先在终端中发起debug server,然后再去vscode debug页面单击一下绿色箭头开启debug。

Description of the image

接下来的操作就和上面一样了。

4.3.3 使用别名简化命令

这边有个不方便的地方,python -m debugpy --listen 5678 --wait-for-client这个命令太长了,每次都打很麻烦。这里我们可以给这段常用的命令设置一个别名。

linux系统中,可以对 ~/.bashrc 文件中添加以下命令

alias pyd='python -m debugpy --wait-for-client --listen 5678'

然后执行

source~/.bashrc

这样之后使用 pyd 命令(你可以自己命名) 替代 python 就能在命令行中起debug了,之前的debug命令就变成了

pyd ./myscript.py

Ch5 Python调用InternLM api

5.1 如何获取api key

前往书生浦语的API文档,登陆后点击API tokens。初次使用可能会需要先填写邀请码。

Description of the image

然后创建一个新的api token。

Description of the image
Description of the image

这里一定要注意,浦语的token只有刚创建的时候才能看到全文,后续没法再查看已经创建好的token,如果忘记需要重新创建,所以创建完了以后记得先复制保存到本地。

5.2 如何使用InternLM api

我们可以使用openai python sdk来调用InternLM api。注意在配置api key时,更推荐使用环境变量来配置以避免token泄露。

#./internlm_test.pyfromopenaiimportOpenAIimportosdefinternlm_gen(prompt,client):
''' LLM生成函数 Param prompt: prompt string Param client: OpenAI client  '''response=client.chat.completions.create(
model="internlm2.5-latest",
messages=[
{"role": "user", "content": prompt},
],
stream=False
)
returnresponse.choices[0].message.contentapi_key=os.getenv('api_key')
#api_key = "" #也可以明文写在代码内,不推荐client=OpenAI(base_url="https://internlm-chat.intern-ai.org.cn/puyu/api/v1/",api_key=api_key)
prompt='''你好!你是谁?'''response=internlm_gen(prompt,client)
print(response)

我们可以在终端中临时将token加入变量,此时该环境变量只在当前终端内有效。所以该种方法需要我们在该终端中运行我们的py脚本。

export api_key="填入你的api token"
python internlm_test.py

若是想永久加入环境变量,可以对 ~/.bashrc 文件中添加以下命令。

export api_key="填入你的api token"

保存后记得source ~/.bashrc

运行效果如下:

Description of the image

Ch6: Python基础

本课程也提供一个简易的Python基础教程(内容较多,请前往python_intro.md浏览)。

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

History

Folders and files

NameName
Last commit message
Last commit date

parent directory

..

readme.md

Python

B站封面

Intro

欢迎来到书生浦语大模型实战营基础部分Python关卡,本关主要由以下四大块内容组成:

  • Conda虚拟环境
  • pip安装三方依赖包
  • VScode中的Python Debug
  • 调用InternLM API
  • Python基础语法

学习完成后,完成以下两个任务并经过助教批改视为闯关成功

任务类型任务内容预计耗时
闯关任务Leetcode 38315mins
闯关任务Vscode连接InternStudio debug笔记15mins

任务具体描述见task.md

TIPS:本关内容覆盖较多,知识点较杂,如果有不清楚或者不懂的地方可以随时提问。同时如果觉得教程有问题的地方也请随时提出,让我们一起把本教程优化得更好,帮助更多的人走进大模型的世界。

Ch1 Conda虚拟环境

虚拟环境是Python开发中不可或缺的一部分,它允许你在不同的项目中使用不同版本的库,避免依赖冲突。Conda是一个强大的包管理器和环境管理器。

1.1 创建新环境

首先,确保你已经安装了Anaconda或Miniconda。在开发机上已经安装好了conda,大家可以直接使用。创建虚拟环境时我们主要需要设置两个参数,一是虚拟环境的名字,二是python的版本。

conda create --name myenv python=3.9

这将创建一个名为myenv的新环境,使用Python 3.9。 在安装包时会有一步二次确认,填y就行。

1.2 环境管理

要使用创建好的虚拟环境,我们需要先激活环境。激活我们刚刚创建的myenv环境的命令如下:

conda activate myenv

如果要退出环境,回到默认环境,命令为

conda deactivate

其他常见的虚拟环境管理命令还有

#查看当前设备上所有的虚拟环境
conda env list
#查看当前环境中安装了的所有包
conda list
#删除环境(比如要删除myenv)
conda env remove myenv

1.3 安装虚拟环境到指定目录

有时我们会遇到想将整个虚拟环境保存到制定目录来共享,比如在局域网内,或者在InternStudio的团队开发机间共享。此时我们可以把conda的虚拟环境创建到指定目录下。

只需要在创建环境时使用--prefix参数制定环境所在的文件夹即可,比如我们想在/root/envs/路径下创建刚刚我们创建过得myenv(只做演示,不用操作)。

conda create --prefix /root/envs/myenv python=3.9

其他操作就与直接在默认路径下创建新环境没有区别了。想要激活保存在制定目录下的conda虚拟环境也十分简单,直接将环境名替换成所在文件夹就行。

conda activate /root/envs/myenv

myenv这个文件夹里包含了整个虚拟环境,所以理论上将他直接拷贝到任意一台安装了conda的机器上都能直接激活使用,这也是在内网机器上做环境配置的一种效率较高的解决方案。

Ch2 使用pip安装Python三方依赖包

在Python开发中,安装和管理第三方包是日常任务。pip是Python官方的包管理工具,全称为“Python Package Installer”,用于方便地安装、升级和管理Python包。

2.1 使用pip安装包

注意在使用conda的时候,我们需要先激活我们要用的虚拟环境,再在激活的虚拟环境中,使用pip来安装包。pip安装包的命令为pip install

pip install <somepackage># 安装单个包,<somepackage>替换成你要安装的包名
pip install pandas numpy # 安装多个包,如panda和numpy
pip install numpy==2.0 # 指定版本安装
pip install numpy>=1.19,<2.0 # 使用版本范围安装

2.2 安装requirement.txt

如果你有一个包含所有依赖信息的requirements.txt文件,可以使用-r一次性安装所有依赖。requirements.txt在各种开源代码中经常可以看到,里面描述了运行该代码所需要的包和对应版本。

pip install -r requirements.txt

比如以下就是我们接下来会接触到的LLM部署框架lmdeploy的requirements.txt 的一部分(只做展示,大家不用自行安装)

accelerate>=0.29.3
mmengine-lite
numpy<2.0.0
openai
peft<=0.11.1
transformers
triton>=2.1.0,<=2.3.1;

2.3 安装到指定目录

为了节省大家的存储空间,本次实战营可以直接使用share目录下的conda环境,但share目录只有读权限,所以要安装额外的包时我们不能直接使用pip将包安装到对应环境中,需要安装到我们自己的目录下。

这时我们在使用pip的时候可以使用--target-t参数来指定安装目录,此时pip会将你需要安装的包安装到你指定的目录下。

这里我们用本次实战营最常用的环境/root/share/pre_envs/pytorch2.1.2cu12.1来举例。

# 首先激活环境
conda activate /root/share/pre_envs/pytorch2.1.2cu12.1
# 创建一个目录/root/myenvs,并将包安装到这个目录下
mkdir -p /root/myenvs
pip install <somepackage> --target /root/myenvs
# 注意这里也可以使用-r来安装requirements.txt
pip install -r requirements.txt --target /root/myenvs

要使用安装在指定目录的python包,可以在python脚本开头临时动态地将该路径加入python环境变量中去

importsys# 你要添加的目录路径 your_directory='/root/myenvs'# 检查该目录是否已经在 sys.path 中 ifyour_directorynotinsys.path: # 将目录添加到 sys.path sys.path.append(your_directory) # 现在你可以直接导入该目录中的模块了 # 例如:import your_module

Ch3 使用本地Vscode连接InternStudio开发机

3.1 使用SSH连接开发机

VSCode是由微软开发一款轻量级但功能强大的代码编辑器,开源且完全免费。它拥有丰富的插件生态系统、跨平台支持、以及内置的Git控制功能,为开发者提供了高效便捷的编码体验。

VScode下载地址:Visual Studio Code - Code Editing. Redefined

首先需要安装Remote-SSH插件,安装完成后进入Remote Explorer,在ssh目录下新建一个ssh链接。

Description of the imageDescription of the image
安装Remote-SSH 进入Remote Explorer

点击+号,此时会有弹窗提示输入SSH链接命令(具体请看下文),回车后选择要更新的SSH配置文件,默认选择第一个即可(如有需要也可新建一个SSH配置文件)。

Description of the imageDescription of the image
输入链接命令 选择默认配置文件

开发机的链接命令可以在开发机控制台对应开发机"SSH连接"找到,复制登录命令到vscode的弹窗中然后回车,vscode就会开始链接InternStudio的服务器,记得此时切回去复制一下ssh的密码,待会会用到。

Description of the image

在新的弹窗中将SSH密码粘贴进去然后回车。随后会弹窗让选择远程终端的类型,选择Linux即可,因为我们的开发机是Linux系统。

首次连接会进行一些初始化设置,可能会比较慢,请耐心等待。后续打开文件夹时可能会再次需要输入密码,建议保持开发机的控制台开启以备不时之需。

当界面左下角显示远程连接地址SSH:ssh.intern-ai.org.cn时,说明连接成功。此时,我们可以像在本地使用VSCode一样,在开发机上进行各种操作。

连接成功后我们打开远程连接的vscode的extensions,在远程开发机(SSH:SSH.INTERN-AI.ORG.CN) 上安装好python的插件,后面python debug会用到。也可以一键把我们本地vscode的插件安装到开发机上。

Description of the image
Description of the image

3.2如何在Vscode中打开终端

可以有两种常用的方法打开终端:

  1. 单击VSCode页面底部状态栏中的“终端”图标(通常显示为两个图标一个X和一个),可以快速打开VSCode的终端面板。
  2. 使用快捷键Ctrl+`(反引号,tab键上面那一个),也可以快速打开VSCode的终端面板。

TIPS:终端面板右上方的+可以新建一个TERMINAL。

Ch4 使用vscode连接开发机进行python debug

4.1 什么是debug?

当你刚开始学习Python编程时,可能会遇到代码不按预期运行的情况。这时,你就需要用到“debug”了。简单来说,“debug”就是能再程序中设置中断点并支持一行一行地运行代码,观测程序中变量的变化,然后找出并修正代码中的错误。而VSCode提供了一个非常方便的debug工具,可以帮助你更容易地找到和修复错误。

4.2 使用Vscode进行Python debug的流程

4.2.1 debug单个python文件

defrange_sum(start,end):
sum_res=0foriinrange(start,end):
sum_res+=ireturnsum_resif__name__=="__main__":
print(range_sum(1,10))

Step1.安装Python扩展

  • 打开VSCode,点击左侧扩展栏,搜索Python,并安装。

Step2配置调试

  • 打开你的Python文件,点击左侧活动栏的“运行和调试”图标。
  • 首次debug需要配置以下,点击“create a launch.json file”,选择python debugger后选择“Python File” config。
Description of the image
  • 可以直接编辑生成的launch.json文件,配置调试参数,比如添加config(Add Configuration)等。
Description of the image

新建python文件后我们如果想要运行,首先需要选择解释器。单击右下角的select interpreter,vsconde会自动扫描开发机上所有的python环境中的解释器。

Step3.设置断点

在代码行号旁边点击,可以添加一个红点,这就是断点(如果不能添加红点需要检查一下Python扩展是否已经正确安装)。当代码运行到这里时,它会停下来,这样你就可以检查变量的值、执行步骤等。接下来,我们在第4行的核心代码处打上断点。

Description of the image

Step4.启动debug

点击VSCode侧边栏的“Run and Debug”(运行和调试),选择调试配置后,点击绿色箭头(开始调试)按钮,或者按F5键。

Description of the image

Step5.查看变量

当代码在断点处停下来时,你可以查看和修改变量的值。在“Run and Debug”侧边栏的“Variables”(变量)部分,你可以看到当前作用域内的所有变量及其值。

Description of the image

Step6.单步执行代码

你可以使用顶部的debug面板的按钮来单步执行代码。这样,你可以逐行运行代码,并查看每行代码执行后的效果。

Description of the image

debug面板各按钮功能介绍:

  1. continue: 继续运行到下一个断点。

  2. step over: 单步跳过,可以理解为运行当前行代码,不进入具体的函数或者方法。

  3. step into: 单步进入。如果当前行代码存在函数调用,则进入该函数内部。如果当前行代码没有函数调用,则等价于step over

  4. step out: 单步退出函数,返回到调用该函数的上一层代码。

  5. restart: 重新启动调试。

  6. stop: 终止调试。

Step7.修复错误并重新运行

如果你找到了代码中的错误,可以修复它,然后重新运行debug来确保问题已经被解决。

通过遵循以上步骤,你可以使用VSCode的debug功能来更容易地找到和修复你Python代码中的错误。可以自己编写一个简单的python脚本,并尝试使用debug来更好的理解代码的运行逻辑。记住,debug是编程中非常重要的一部分,所以不要怕花时间在这上面。随着时间的推移,你会变得越来越擅长它!

4.2.2 不同的断点

在调试(Debug)过程中,断点(Breakpoint)允许程序员在程序的执行流程中设置暂停点。当程序运行到这些断点时,执行会暂时中断,使得我们可以检查此时程序的状态,包括变量的值、内存的内容等。断点为我们提供了一个观察程序运行细节的机会,从而帮助我们定位和解决程序中的错误或问题。在VSCode中,我们还可以设置条件断点,这样断点只有在满足特定条件时才会触发。

  1. 普通断点:在代码行号左侧点击,添加断点。
  2. 条件断点:在断点标记上右键,选择条件断点(conditional breakpoint)。VSCode 中常用的条件断点主要有三种类型:
    1. 表达式(Expression):输入一个 Python 表达式,每次触发断点时运行该表达式,当表达式的值为 True 时 VS Code 会暂停执行。例如:x == 10
    2. 触发计数(Hit Count):断点触发计数达到输入值时才会暂停运行。
    3. 记录日志(Log Message):触发该断点时在 Debug Console 中输出指定信息,实际上就是 logpoint。需要输入要输出的信息,如果要用到表达式,可以使用 {} 将表达式括起来。例如,每次记录变量 i 的值可以写 x={i}

表达式条件断点

比如我们想让代码在 i=end-1 时停下来,可以这样设置: 在断点处右键选择“条件断点”,然后输入条件 i == end-1

Description of the image

回车保存断点,然后运行debug,可以看到程序在i=9的时候停了下来,此时各变量的值如下

Description of the image

触发计数条件断点

如果我们想让sum_res+=i在运行5次后停下来,我们可以在这行设置Hit count断点为5。

Description of the image

运行debug后,程序第一次暂停时各变量的状态为

Description of the image

记录日志条件断点

在Log Message输入 Current i is {i} 每次触发时记录一下 i 的值

Description of the image

运行debug后我们可以在终端面板的debug console看到

Description of the image

4.3 在vscode使用命令行进行debug

很多时候我们要debug的不止是一个简单的python文件,而是很多参数,参数中不止会有简单的值还可能有错综复杂的文件关系,甚至debug一整个项目。这种情况下,直接使用命令行来发起debug会是一个更好的选择。

4.3.1 vscode设置

vscode支持通过remote的方法连接我们在命令行中发起的debug server。首先我们要配置一下debug的config。

还是点击VSCode侧边栏的“Run and Debug”(运行和调试),单击"create a lauch.json file"

选择debugger时选择python debuger。选择debug config时选择remote attach就行,随后会让我们选择debug server的地址,因为我们是在本地debug,所以全都保持默认直接回车就可以了,也就是我们的server地址为 localhost:5678

Description of the image

配置完以后会打开配置的json文件,但这不是重点,可以关掉。这时我们会看到run and debug界面有变化,出现了debug选项。

Description of the image

4.3.2 debug命令行

现在vscode已经准备就绪,让我们来看看如何在命令行中发起debug。如果没有安装debugpy的话可以先通过pip install debugpy安装一下。

python -m debugpy --listen 5678 --wait-for-client ./myscript.py
  • ./myscript.py可以替换为我们想要debug的python文件,后面可以和直接在命令行中启动python一样跟上输入的参数。记得要先在想要debug的python文件打好断点并保存。

  • --wait-for-client参数会让我们的debug server在等客户端连入后才开始运行debug。在这就是要等到我们在run and debug界面启动debug。

先在终端中发起debug server,然后再去vscode debug页面单击一下绿色箭头开启debug。

Description of the image

接下来的操作就和上面一样了。

4.3.3 使用别名简化命令

这边有个不方便的地方,python -m debugpy --listen 5678 --wait-for-client这个命令太长了,每次都打很麻烦。这里我们可以给这段常用的命令设置一个别名。

linux系统中,可以对 ~/.bashrc 文件中添加以下命令

alias pyd='python -m debugpy --wait-for-client --listen 5678'

然后执行

source~/.bashrc

这样之后使用 pyd 命令(你可以自己命名) 替代 python 就能在命令行中起debug了,之前的debug命令就变成了

pyd ./myscript.py

Ch5 Python调用InternLM api

5.1 如何获取api key

前往书生浦语的API文档,登陆后点击API tokens。初次使用可能会需要先填写邀请码。

Description of the image

然后创建一个新的api token。

Description of the image
Description of the image

这里一定要注意,浦语的token只有刚创建的时候才能看到全文,后续没法再查看已经创建好的token,如果忘记需要重新创建,所以创建完了以后记得先复制保存到本地。

5.2 如何使用InternLM api

我们可以使用openai python sdk来调用InternLM api。注意在配置api key时,更推荐使用环境变量来配置以避免token泄露。

#./internlm_test.pyfromopenaiimportOpenAIimportosdefinternlm_gen(prompt,client):
''' LLM生成函数 Param prompt: prompt string Param client: OpenAI client  '''response=client.chat.completions.create(
model="internlm2.5-latest",
messages=[
{"role": "user", "content": prompt},
],
stream=False
)
returnresponse.choices[0].message.contentapi_key=os.getenv('api_key')
#api_key = "" #也可以明文写在代码内,不推荐client=OpenAI(base_url="https://internlm-chat.intern-ai.org.cn/puyu/api/v1/",api_key=api_key)
prompt='''你好!你是谁?'''response=internlm_gen(prompt,client)
print(response)

我们可以在终端中临时将token加入变量,此时该环境变量只在当前终端内有效。所以该种方法需要我们在该终端中运行我们的py脚本。

export api_key="填入你的api token"
python internlm_test.py

若是想永久加入环境变量,可以对 ~/.bashrc 文件中添加以下命令。

export api_key="填入你的api token"

保存后记得source ~/.bashrc

运行效果如下:

Description of the image

Ch6: Python基础

本课程也提供一个简易的Python基础教程(内容较多,请前往python_intro.md浏览)。

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

History

Folders and files

NameName
Last commit message
Last commit date

parent directory

..

readme.md

Python

B站封面

Intro

欢迎来到书生浦语大模型实战营基础部分Python关卡,本关主要由以下四大块内容组成:

  • Conda虚拟环境
  • pip安装三方依赖包
  • VScode中的Python Debug
  • 调用InternLM API
  • Python基础语法

学习完成后,完成以下两个任务并经过助教批改视为闯关成功

任务类型任务内容预计耗时
闯关任务Leetcode 38315mins
闯关任务Vscode连接InternStudio debug笔记15mins

任务具体描述见task.md

TIPS:本关内容覆盖较多,知识点较杂,如果有不清楚或者不懂的地方可以随时提问。同时如果觉得教程有问题的地方也请随时提出,让我们一起把本教程优化得更好,帮助更多的人走进大模型的世界。

Ch1 Conda虚拟环境

虚拟环境是Python开发中不可或缺的一部分,它允许你在不同的项目中使用不同版本的库,避免依赖冲突。Conda是一个强大的包管理器和环境管理器。

1.1 创建新环境

首先,确保你已经安装了Anaconda或Miniconda。在开发机上已经安装好了conda,大家可以直接使用。创建虚拟环境时我们主要需要设置两个参数,一是虚拟环境的名字,二是python的版本。

conda create --name myenv python=3.9

这将创建一个名为myenv的新环境,使用Python 3.9。 在安装包时会有一步二次确认,填y就行。

1.2 环境管理

要使用创建好的虚拟环境,我们需要先激活环境。激活我们刚刚创建的myenv环境的命令如下:

conda activate myenv

如果要退出环境,回到默认环境,命令为

conda deactivate

其他常见的虚拟环境管理命令还有

#查看当前设备上所有的虚拟环境
conda env list
#查看当前环境中安装了的所有包
conda list
#删除环境(比如要删除myenv)
conda env remove myenv

1.3 安装虚拟环境到指定目录

有时我们会遇到想将整个虚拟环境保存到制定目录来共享,比如在局域网内,或者在InternStudio的团队开发机间共享。此时我们可以把conda的虚拟环境创建到指定目录下。

只需要在创建环境时使用--prefix参数制定环境所在的文件夹即可,比如我们想在/root/envs/路径下创建刚刚我们创建过得myenv(只做演示,不用操作)。

conda create --prefix /root/envs/myenv python=3.9

其他操作就与直接在默认路径下创建新环境没有区别了。想要激活保存在制定目录下的conda虚拟环境也十分简单,直接将环境名替换成所在文件夹就行。

conda activate /root/envs/myenv

myenv这个文件夹里包含了整个虚拟环境,所以理论上将他直接拷贝到任意一台安装了conda的机器上都能直接激活使用,这也是在内网机器上做环境配置的一种效率较高的解决方案。

Ch2 使用pip安装Python三方依赖包

在Python开发中,安装和管理第三方包是日常任务。pip是Python官方的包管理工具,全称为“Python Package Installer”,用于方便地安装、升级和管理Python包。

2.1 使用pip安装包

注意在使用conda的时候,我们需要先激活我们要用的虚拟环境,再在激活的虚拟环境中,使用pip来安装包。pip安装包的命令为pip install

pip install <somepackage># 安装单个包,<somepackage>替换成你要安装的包名
pip install pandas numpy # 安装多个包,如panda和numpy
pip install numpy==2.0 # 指定版本安装
pip install numpy>=1.19,<2.0 # 使用版本范围安装

2.2 安装requirement.txt

如果你有一个包含所有依赖信息的requirements.txt文件,可以使用-r一次性安装所有依赖。requirements.txt在各种开源代码中经常可以看到,里面描述了运行该代码所需要的包和对应版本。

pip install -r requirements.txt

比如以下就是我们接下来会接触到的LLM部署框架lmdeploy的requirements.txt 的一部分(只做展示,大家不用自行安装)

accelerate>=0.29.3
mmengine-lite
numpy<2.0.0
openai
peft<=0.11.1
transformers
triton>=2.1.0,<=2.3.1;

2.3 安装到指定目录

为了节省大家的存储空间,本次实战营可以直接使用share目录下的conda环境,但share目录只有读权限,所以要安装额外的包时我们不能直接使用pip将包安装到对应环境中,需要安装到我们自己的目录下。

这时我们在使用pip的时候可以使用--target-t参数来指定安装目录,此时pip会将你需要安装的包安装到你指定的目录下。

这里我们用本次实战营最常用的环境/root/share/pre_envs/pytorch2.1.2cu12.1来举例。

# 首先激活环境
conda activate /root/share/pre_envs/pytorch2.1.2cu12.1
# 创建一个目录/root/myenvs,并将包安装到这个目录下
mkdir -p /root/myenvs
pip install <somepackage> --target /root/myenvs
# 注意这里也可以使用-r来安装requirements.txt
pip install -r requirements.txt --target /root/myenvs

要使用安装在指定目录的python包,可以在python脚本开头临时动态地将该路径加入python环境变量中去

importsys# 你要添加的目录路径 your_directory='/root/myenvs'# 检查该目录是否已经在 sys.path 中 ifyour_directorynotinsys.path: # 将目录添加到 sys.path sys.path.append(your_directory) # 现在你可以直接导入该目录中的模块了 # 例如:import your_module

Ch3 使用本地Vscode连接InternStudio开发机

3.1 使用SSH连接开发机

VSCode是由微软开发一款轻量级但功能强大的代码编辑器,开源且完全免费。它拥有丰富的插件生态系统、跨平台支持、以及内置的Git控制功能,为开发者提供了高效便捷的编码体验。

VScode下载地址:Visual Studio Code - Code Editing. Redefined

首先需要安装Remote-SSH插件,安装完成后进入Remote Explorer,在ssh目录下新建一个ssh链接。

Description of the imageDescription of the image
安装Remote-SSH 进入Remote Explorer

点击+号,此时会有弹窗提示输入SSH链接命令(具体请看下文),回车后选择要更新的SSH配置文件,默认选择第一个即可(如有需要也可新建一个SSH配置文件)。

Description of the imageDescription of the image
输入链接命令 选择默认配置文件

开发机的链接命令可以在开发机控制台对应开发机"SSH连接"找到,复制登录命令到vscode的弹窗中然后回车,vscode就会开始链接InternStudio的服务器,记得此时切回去复制一下ssh的密码,待会会用到。

Description of the image

在新的弹窗中将SSH密码粘贴进去然后回车。随后会弹窗让选择远程终端的类型,选择Linux即可,因为我们的开发机是Linux系统。

首次连接会进行一些初始化设置,可能会比较慢,请耐心等待。后续打开文件夹时可能会再次需要输入密码,建议保持开发机的控制台开启以备不时之需。

当界面左下角显示远程连接地址SSH:ssh.intern-ai.org.cn时,说明连接成功。此时,我们可以像在本地使用VSCode一样,在开发机上进行各种操作。

连接成功后我们打开远程连接的vscode的extensions,在远程开发机(SSH:SSH.INTERN-AI.ORG.CN) 上安装好python的插件,后面python debug会用到。也可以一键把我们本地vscode的插件安装到开发机上。

Description of the image
Description of the image

3.2如何在Vscode中打开终端

可以有两种常用的方法打开终端:

  1. 单击VSCode页面底部状态栏中的“终端”图标(通常显示为两个图标一个X和一个),可以快速打开VSCode的终端面板。
  2. 使用快捷键Ctrl+`(反引号,tab键上面那一个),也可以快速打开VSCode的终端面板。

TIPS:终端面板右上方的+可以新建一个TERMINAL。

Ch4 使用vscode连接开发机进行python debug

4.1 什么是debug?

当你刚开始学习Python编程时,可能会遇到代码不按预期运行的情况。这时,你就需要用到“debug”了。简单来说,“debug”就是能再程序中设置中断点并支持一行一行地运行代码,观测程序中变量的变化,然后找出并修正代码中的错误。而VSCode提供了一个非常方便的debug工具,可以帮助你更容易地找到和修复错误。

4.2 使用Vscode进行Python debug的流程

4.2.1 debug单个python文件

defrange_sum(start,end):
sum_res=0foriinrange(start,end):
sum_res+=ireturnsum_resif__name__=="__main__":
print(range_sum(1,10))

Step1.安装Python扩展

  • 打开VSCode,点击左侧扩展栏,搜索Python,并安装。

Step2配置调试

  • 打开你的Python文件,点击左侧活动栏的“运行和调试”图标。
  • 首次debug需要配置以下,点击“create a launch.json file”,选择python debugger后选择“Python File” config。
Description of the image
  • 可以直接编辑生成的launch.json文件,配置调试参数,比如添加config(Add Configuration)等。
Description of the image

新建python文件后我们如果想要运行,首先需要选择解释器。单击右下角的select interpreter,vsconde会自动扫描开发机上所有的python环境中的解释器。

Step3.设置断点

在代码行号旁边点击,可以添加一个红点,这就是断点(如果不能添加红点需要检查一下Python扩展是否已经正确安装)。当代码运行到这里时,它会停下来,这样你就可以检查变量的值、执行步骤等。接下来,我们在第4行的核心代码处打上断点。

Description of the image

Step4.启动debug

点击VSCode侧边栏的“Run and Debug”(运行和调试),选择调试配置后,点击绿色箭头(开始调试)按钮,或者按F5键。

Description of the image

Step5.查看变量

当代码在断点处停下来时,你可以查看和修改变量的值。在“Run and Debug”侧边栏的“Variables”(变量)部分,你可以看到当前作用域内的所有变量及其值。

Description of the image

Step6.单步执行代码

你可以使用顶部的debug面板的按钮来单步执行代码。这样,你可以逐行运行代码,并查看每行代码执行后的效果。

Description of the image

debug面板各按钮功能介绍:

  1. continue: 继续运行到下一个断点。

  2. step over: 单步跳过,可以理解为运行当前行代码,不进入具体的函数或者方法。

  3. step into: 单步进入。如果当前行代码存在函数调用,则进入该函数内部。如果当前行代码没有函数调用,则等价于step over

  4. step out: 单步退出函数,返回到调用该函数的上一层代码。

  5. restart: 重新启动调试。

  6. stop: 终止调试。

Step7.修复错误并重新运行

如果你找到了代码中的错误,可以修复它,然后重新运行debug来确保问题已经被解决。

通过遵循以上步骤,你可以使用VSCode的debug功能来更容易地找到和修复你Python代码中的错误。可以自己编写一个简单的python脚本,并尝试使用debug来更好的理解代码的运行逻辑。记住,debug是编程中非常重要的一部分,所以不要怕花时间在这上面。随着时间的推移,你会变得越来越擅长它!

4.2.2 不同的断点

在调试(Debug)过程中,断点(Breakpoint)允许程序员在程序的执行流程中设置暂停点。当程序运行到这些断点时,执行会暂时中断,使得我们可以检查此时程序的状态,包括变量的值、内存的内容等。断点为我们提供了一个观察程序运行细节的机会,从而帮助我们定位和解决程序中的错误或问题。在VSCode中,我们还可以设置条件断点,这样断点只有在满足特定条件时才会触发。

  1. 普通断点:在代码行号左侧点击,添加断点。
  2. 条件断点:在断点标记上右键,选择条件断点(conditional breakpoint)。VSCode 中常用的条件断点主要有三种类型:
    1. 表达式(Expression):输入一个 Python 表达式,每次触发断点时运行该表达式,当表达式的值为 True 时 VS Code 会暂停执行。例如:x == 10
    2. 触发计数(Hit Count):断点触发计数达到输入值时才会暂停运行。
    3. 记录日志(Log Message):触发该断点时在 Debug Console 中输出指定信息,实际上就是 logpoint。需要输入要输出的信息,如果要用到表达式,可以使用 {} 将表达式括起来。例如,每次记录变量 i 的值可以写 x={i}

表达式条件断点

比如我们想让代码在 i=end-1 时停下来,可以这样设置: 在断点处右键选择“条件断点”,然后输入条件 i == end-1

Description of the image

回车保存断点,然后运行debug,可以看到程序在i=9的时候停了下来,此时各变量的值如下

Description of the image

触发计数条件断点

如果我们想让sum_res+=i在运行5次后停下来,我们可以在这行设置Hit count断点为5。

Description of the image

运行debug后,程序第一次暂停时各变量的状态为

Description of the image

记录日志条件断点

在Log Message输入 Current i is {i} 每次触发时记录一下 i 的值

Description of the image

运行debug后我们可以在终端面板的debug console看到

Description of the image

4.3 在vscode使用命令行进行debug

很多时候我们要debug的不止是一个简单的python文件,而是很多参数,参数中不止会有简单的值还可能有错综复杂的文件关系,甚至debug一整个项目。这种情况下,直接使用命令行来发起debug会是一个更好的选择。

4.3.1 vscode设置

vscode支持通过remote的方法连接我们在命令行中发起的debug server。首先我们要配置一下debug的config。

还是点击VSCode侧边栏的“Run and Debug”(运行和调试),单击"create a lauch.json file"

选择debugger时选择python debuger。选择debug config时选择remote attach就行,随后会让我们选择debug server的地址,因为我们是在本地debug,所以全都保持默认直接回车就可以了,也就是我们的server地址为 localhost:5678

Description of the image

配置完以后会打开配置的json文件,但这不是重点,可以关掉。这时我们会看到run and debug界面有变化,出现了debug选项。

Description of the image

4.3.2 debug命令行

现在vscode已经准备就绪,让我们来看看如何在命令行中发起debug。如果没有安装debugpy的话可以先通过pip install debugpy安装一下。

python -m debugpy --listen 5678 --wait-for-client ./myscript.py
  • ./myscript.py可以替换为我们想要debug的python文件,后面可以和直接在命令行中启动python一样跟上输入的参数。记得要先在想要debug的python文件打好断点并保存。

  • --wait-for-client参数会让我们的debug server在等客户端连入后才开始运行debug。在这就是要等到我们在run and debug界面启动debug。

先在终端中发起debug server,然后再去vscode debug页面单击一下绿色箭头开启debug。

Description of the image

接下来的操作就和上面一样了。

4.3.3 使用别名简化命令

这边有个不方便的地方,python -m debugpy --listen 5678 --wait-for-client这个命令太长了,每次都打很麻烦。这里我们可以给这段常用的命令设置一个别名。

linux系统中,可以对 ~/.bashrc 文件中添加以下命令

alias pyd='python -m debugpy --wait-for-client --listen 5678'

然后执行

source~/.bashrc

这样之后使用 pyd 命令(你可以自己命名) 替代 python 就能在命令行中起debug了,之前的debug命令就变成了

pyd ./myscript.py

Ch5 Python调用InternLM api

5.1 如何获取api key

前往书生浦语的API文档,登陆后点击API tokens。初次使用可能会需要先填写邀请码。

Description of the image

然后创建一个新的api token。

Description of the image
Description of the image

这里一定要注意,浦语的token只有刚创建的时候才能看到全文,后续没法再查看已经创建好的token,如果忘记需要重新创建,所以创建完了以后记得先复制保存到本地。

5.2 如何使用InternLM api

我们可以使用openai python sdk来调用InternLM api。注意在配置api key时,更推荐使用环境变量来配置以避免token泄露。

#./internlm_test.pyfromopenaiimportOpenAIimportosdefinternlm_gen(prompt,client):
''' LLM生成函数 Param prompt: prompt string Param client: OpenAI client  '''response=client.chat.completions.create(
model="internlm2.5-latest",
messages=[
{"role": "user", "content": prompt},
],
stream=False
)
returnresponse.choices[0].message.contentapi_key=os.getenv('api_key')
#api_key = "" #也可以明文写在代码内,不推荐client=OpenAI(base_url="https://internlm-chat.intern-ai.org.cn/puyu/api/v1/",api_key=api_key)
prompt='''你好!你是谁?'''response=internlm_gen(prompt,client)
print(response)

我们可以在终端中临时将token加入变量,此时该环境变量只在当前终端内有效。所以该种方法需要我们在该终端中运行我们的py脚本。

export api_key="填入你的api token"
python internlm_test.py

若是想永久加入环境变量,可以对 ~/.bashrc 文件中添加以下命令。

export api_key="填入你的api token"

保存后记得source ~/.bashrc

运行效果如下:

Description of the image

Ch6: Python基础

本课程也提供一个简易的Python基础教程(内容较多,请前往python_intro.md浏览)。

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

History

Folders and files

NameName
Last commit message
Last commit date

parent directory

..

readme.md

Python

B站封面

Intro

欢迎来到书生浦语大模型实战营基础部分Python关卡,本关主要由以下四大块内容组成:

  • Conda虚拟环境
  • pip安装三方依赖包
  • VScode中的Python Debug
  • 调用InternLM API
  • Python基础语法

学习完成后,完成以下两个任务并经过助教批改视为闯关成功

任务类型任务内容预计耗时
闯关任务Leetcode 38315mins
闯关任务Vscode连接InternStudio debug笔记15mins

任务具体描述见task.md

TIPS:本关内容覆盖较多,知识点较杂,如果有不清楚或者不懂的地方可以随时提问。同时如果觉得教程有问题的地方也请随时提出,让我们一起把本教程优化得更好,帮助更多的人走进大模型的世界。

Ch1 Conda虚拟环境

虚拟环境是Python开发中不可或缺的一部分,它允许你在不同的项目中使用不同版本的库,避免依赖冲突。Conda是一个强大的包管理器和环境管理器。

1.1 创建新环境

首先,确保你已经安装了Anaconda或Miniconda。在开发机上已经安装好了conda,大家可以直接使用。创建虚拟环境时我们主要需要设置两个参数,一是虚拟环境的名字,二是python的版本。

conda create --name myenv python=3.9

这将创建一个名为myenv的新环境,使用Python 3.9。 在安装包时会有一步二次确认,填y就行。

1.2 环境管理

要使用创建好的虚拟环境,我们需要先激活环境。激活我们刚刚创建的myenv环境的命令如下:

conda activate myenv

如果要退出环境,回到默认环境,命令为

conda deactivate

其他常见的虚拟环境管理命令还有

#查看当前设备上所有的虚拟环境
conda env list
#查看当前环境中安装了的所有包
conda list
#删除环境(比如要删除myenv)
conda env remove myenv

1.3 安装虚拟环境到指定目录

有时我们会遇到想将整个虚拟环境保存到制定目录来共享,比如在局域网内,或者在InternStudio的团队开发机间共享。此时我们可以把conda的虚拟环境创建到指定目录下。

只需要在创建环境时使用--prefix参数制定环境所在的文件夹即可,比如我们想在/root/envs/路径下创建刚刚我们创建过得myenv(只做演示,不用操作)。

conda create --prefix /root/envs/myenv python=3.9

其他操作就与直接在默认路径下创建新环境没有区别了。想要激活保存在制定目录下的conda虚拟环境也十分简单,直接将环境名替换成所在文件夹就行。

conda activate /root/envs/myenv

myenv这个文件夹里包含了整个虚拟环境,所以理论上将他直接拷贝到任意一台安装了conda的机器上都能直接激活使用,这也是在内网机器上做环境配置的一种效率较高的解决方案。

Ch2 使用pip安装Python三方依赖包

在Python开发中,安装和管理第三方包是日常任务。pip是Python官方的包管理工具,全称为“Python Package Installer”,用于方便地安装、升级和管理Python包。

2.1 使用pip安装包

注意在使用conda的时候,我们需要先激活我们要用的虚拟环境,再在激活的虚拟环境中,使用pip来安装包。pip安装包的命令为pip install

pip install <somepackage># 安装单个包,<somepackage>替换成你要安装的包名
pip install pandas numpy # 安装多个包,如panda和numpy
pip install numpy==2.0 # 指定版本安装
pip install numpy>=1.19,<2.0 # 使用版本范围安装

2.2 安装requirement.txt

如果你有一个包含所有依赖信息的requirements.txt文件,可以使用-r一次性安装所有依赖。requirements.txt在各种开源代码中经常可以看到,里面描述了运行该代码所需要的包和对应版本。

pip install -r requirements.txt

比如以下就是我们接下来会接触到的LLM部署框架lmdeploy的requirements.txt 的一部分(只做展示,大家不用自行安装)

accelerate>=0.29.3
mmengine-lite
numpy<2.0.0
openai
peft<=0.11.1
transformers
triton>=2.1.0,<=2.3.1;

2.3 安装到指定目录

为了节省大家的存储空间,本次实战营可以直接使用share目录下的conda环境,但share目录只有读权限,所以要安装额外的包时我们不能直接使用pip将包安装到对应环境中,需要安装到我们自己的目录下。

这时我们在使用pip的时候可以使用--target-t参数来指定安装目录,此时pip会将你需要安装的包安装到你指定的目录下。

这里我们用本次实战营最常用的环境/root/share/pre_envs/pytorch2.1.2cu12.1来举例。

# 首先激活环境
conda activate /root/share/pre_envs/pytorch2.1.2cu12.1
# 创建一个目录/root/myenvs,并将包安装到这个目录下
mkdir -p /root/myenvs
pip install <somepackage> --target /root/myenvs
# 注意这里也可以使用-r来安装requirements.txt
pip install -r requirements.txt --target /root/myenvs

要使用安装在指定目录的python包,可以在python脚本开头临时动态地将该路径加入python环境变量中去

importsys# 你要添加的目录路径 your_directory='/root/myenvs'# 检查该目录是否已经在 sys.path 中 ifyour_directorynotinsys.path: # 将目录添加到 sys.path sys.path.append(your_directory) # 现在你可以直接导入该目录中的模块了 # 例如:import your_module

Ch3 使用本地Vscode连接InternStudio开发机

3.1 使用SSH连接开发机

VSCode是由微软开发一款轻量级但功能强大的代码编辑器,开源且完全免费。它拥有丰富的插件生态系统、跨平台支持、以及内置的Git控制功能,为开发者提供了高效便捷的编码体验。

VScode下载地址:Visual Studio Code - Code Editing. Redefined

首先需要安装Remote-SSH插件,安装完成后进入Remote Explorer,在ssh目录下新建一个ssh链接。

Description of the imageDescription of the image
安装Remote-SSH 进入Remote Explorer

点击+号,此时会有弹窗提示输入SSH链接命令(具体请看下文),回车后选择要更新的SSH配置文件,默认选择第一个即可(如有需要也可新建一个SSH配置文件)。

Description of the imageDescription of the image
输入链接命令 选择默认配置文件

开发机的链接命令可以在开发机控制台对应开发机"SSH连接"找到,复制登录命令到vscode的弹窗中然后回车,vscode就会开始链接InternStudio的服务器,记得此时切回去复制一下ssh的密码,待会会用到。

Description of the image

在新的弹窗中将SSH密码粘贴进去然后回车。随后会弹窗让选择远程终端的类型,选择Linux即可,因为我们的开发机是Linux系统。

首次连接会进行一些初始化设置,可能会比较慢,请耐心等待。后续打开文件夹时可能会再次需要输入密码,建议保持开发机的控制台开启以备不时之需。

当界面左下角显示远程连接地址SSH:ssh.intern-ai.org.cn时,说明连接成功。此时,我们可以像在本地使用VSCode一样,在开发机上进行各种操作。

连接成功后我们打开远程连接的vscode的extensions,在远程开发机(SSH:SSH.INTERN-AI.ORG.CN) 上安装好python的插件,后面python debug会用到。也可以一键把我们本地vscode的插件安装到开发机上。

Description of the image
Description of the image

3.2如何在Vscode中打开终端

可以有两种常用的方法打开终端:

  1. 单击VSCode页面底部状态栏中的“终端”图标(通常显示为两个图标一个X和一个),可以快速打开VSCode的终端面板。
  2. 使用快捷键Ctrl+`(反引号,tab键上面那一个),也可以快速打开VSCode的终端面板。

TIPS:终端面板右上方的+可以新建一个TERMINAL。

Ch4 使用vscode连接开发机进行python debug

4.1 什么是debug?

当你刚开始学习Python编程时,可能会遇到代码不按预期运行的情况。这时,你就需要用到“debug”了。简单来说,“debug”就是能再程序中设置中断点并支持一行一行地运行代码,观测程序中变量的变化,然后找出并修正代码中的错误。而VSCode提供了一个非常方便的debug工具,可以帮助你更容易地找到和修复错误。

4.2 使用Vscode进行Python debug的流程

4.2.1 debug单个python文件

defrange_sum(start,end):
sum_res=0foriinrange(start,end):
sum_res+=ireturnsum_resif__name__=="__main__":
print(range_sum(1,10))

Step1.安装Python扩展

  • 打开VSCode,点击左侧扩展栏,搜索Python,并安装。

Step2配置调试

  • 打开你的Python文件,点击左侧活动栏的“运行和调试”图标。
  • 首次debug需要配置以下,点击“create a launch.json file”,选择python debugger后选择“Python File” config。
Description of the image
  • 可以直接编辑生成的launch.json文件,配置调试参数,比如添加config(Add Configuration)等。
Description of the image

新建python文件后我们如果想要运行,首先需要选择解释器。单击右下角的select interpreter,vsconde会自动扫描开发机上所有的python环境中的解释器。

Step3.设置断点

在代码行号旁边点击,可以添加一个红点,这就是断点(如果不能添加红点需要检查一下Python扩展是否已经正确安装)。当代码运行到这里时,它会停下来,这样你就可以检查变量的值、执行步骤等。接下来,我们在第4行的核心代码处打上断点。

Description of the image

Step4.启动debug

点击VSCode侧边栏的“Run and Debug”(运行和调试),选择调试配置后,点击绿色箭头(开始调试)按钮,或者按F5键。

Description of the image

Step5.查看变量

当代码在断点处停下来时,你可以查看和修改变量的值。在“Run and Debug”侧边栏的“Variables”(变量)部分,你可以看到当前作用域内的所有变量及其值。

Description of the image

Step6.单步执行代码

你可以使用顶部的debug面板的按钮来单步执行代码。这样,你可以逐行运行代码,并查看每行代码执行后的效果。

Description of the image

debug面板各按钮功能介绍:

  1. continue: 继续运行到下一个断点。

  2. step over: 单步跳过,可以理解为运行当前行代码,不进入具体的函数或者方法。

  3. step into: 单步进入。如果当前行代码存在函数调用,则进入该函数内部。如果当前行代码没有函数调用,则等价于step over

  4. step out: 单步退出函数,返回到调用该函数的上一层代码。

  5. restart: 重新启动调试。

  6. stop: 终止调试。

Step7.修复错误并重新运行

如果你找到了代码中的错误,可以修复它,然后重新运行debug来确保问题已经被解决。

通过遵循以上步骤,你可以使用VSCode的debug功能来更容易地找到和修复你Python代码中的错误。可以自己编写一个简单的python脚本,并尝试使用debug来更好的理解代码的运行逻辑。记住,debug是编程中非常重要的一部分,所以不要怕花时间在这上面。随着时间的推移,你会变得越来越擅长它!

4.2.2 不同的断点

在调试(Debug)过程中,断点(Breakpoint)允许程序员在程序的执行流程中设置暂停点。当程序运行到这些断点时,执行会暂时中断,使得我们可以检查此时程序的状态,包括变量的值、内存的内容等。断点为我们提供了一个观察程序运行细节的机会,从而帮助我们定位和解决程序中的错误或问题。在VSCode中,我们还可以设置条件断点,这样断点只有在满足特定条件时才会触发。

  1. 普通断点:在代码行号左侧点击,添加断点。
  2. 条件断点:在断点标记上右键,选择条件断点(conditional breakpoint)。VSCode 中常用的条件断点主要有三种类型:
    1. 表达式(Expression):输入一个 Python 表达式,每次触发断点时运行该表达式,当表达式的值为 True 时 VS Code 会暂停执行。例如:x == 10
    2. 触发计数(Hit Count):断点触发计数达到输入值时才会暂停运行。
    3. 记录日志(Log Message):触发该断点时在 Debug Console 中输出指定信息,实际上就是 logpoint。需要输入要输出的信息,如果要用到表达式,可以使用 {} 将表达式括起来。例如,每次记录变量 i 的值可以写 x={i}

表达式条件断点

比如我们想让代码在 i=end-1 时停下来,可以这样设置: 在断点处右键选择“条件断点”,然后输入条件 i == end-1

Description of the image

回车保存断点,然后运行debug,可以看到程序在i=9的时候停了下来,此时各变量的值如下

Description of the image

触发计数条件断点

如果我们想让sum_res+=i在运行5次后停下来,我们可以在这行设置Hit count断点为5。

Description of the image

运行debug后,程序第一次暂停时各变量的状态为

Description of the image

记录日志条件断点

在Log Message输入 Current i is {i} 每次触发时记录一下 i 的值

Description of the image

运行debug后我们可以在终端面板的debug console看到

Description of the image

4.3 在vscode使用命令行进行debug

很多时候我们要debug的不止是一个简单的python文件,而是很多参数,参数中不止会有简单的值还可能有错综复杂的文件关系,甚至debug一整个项目。这种情况下,直接使用命令行来发起debug会是一个更好的选择。

4.3.1 vscode设置

vscode支持通过remote的方法连接我们在命令行中发起的debug server。首先我们要配置一下debug的config。

还是点击VSCode侧边栏的“Run and Debug”(运行和调试),单击"create a lauch.json file"

选择debugger时选择python debuger。选择debug config时选择remote attach就行,随后会让我们选择debug server的地址,因为我们是在本地debug,所以全都保持默认直接回车就可以了,也就是我们的server地址为 localhost:5678

Description of the image

配置完以后会打开配置的json文件,但这不是重点,可以关掉。这时我们会看到run and debug界面有变化,出现了debug选项。

Description of the image

4.3.2 debug命令行

现在vscode已经准备就绪,让我们来看看如何在命令行中发起debug。如果没有安装debugpy的话可以先通过pip install debugpy安装一下。

python -m debugpy --listen 5678 --wait-for-client ./myscript.py
  • ./myscript.py可以替换为我们想要debug的python文件,后面可以和直接在命令行中启动python一样跟上输入的参数。记得要先在想要debug的python文件打好断点并保存。

  • --wait-for-client参数会让我们的debug server在等客户端连入后才开始运行debug。在这就是要等到我们在run and debug界面启动debug。

先在终端中发起debug server,然后再去vscode debug页面单击一下绿色箭头开启debug。

Description of the image

接下来的操作就和上面一样了。

4.3.3 使用别名简化命令

这边有个不方便的地方,python -m debugpy --listen 5678 --wait-for-client这个命令太长了,每次都打很麻烦。这里我们可以给这段常用的命令设置一个别名。

linux系统中,可以对 ~/.bashrc 文件中添加以下命令

alias pyd='python -m debugpy --wait-for-client --listen 5678'

然后执行

source~/.bashrc

这样之后使用 pyd 命令(你可以自己命名) 替代 python 就能在命令行中起debug了,之前的debug命令就变成了

pyd ./myscript.py

Ch5 Python调用InternLM api

5.1 如何获取api key

前往书生浦语的API文档,登陆后点击API tokens。初次使用可能会需要先填写邀请码。

Description of the image

然后创建一个新的api token。

Description of the image
Description of the image

这里一定要注意,浦语的token只有刚创建的时候才能看到全文,后续没法再查看已经创建好的token,如果忘记需要重新创建,所以创建完了以后记得先复制保存到本地。

5.2 如何使用InternLM api

我们可以使用openai python sdk来调用InternLM api。注意在配置api key时,更推荐使用环境变量来配置以避免token泄露。

#./internlm_test.pyfromopenaiimportOpenAIimportosdefinternlm_gen(prompt,client):
''' LLM生成函数 Param prompt: prompt string Param client: OpenAI client  '''response=client.chat.completions.create(
model="internlm2.5-latest",
messages=[
{"role": "user", "content": prompt},
],
stream=False
)
returnresponse.choices[0].message.contentapi_key=os.getenv('api_key')
#api_key = "" #也可以明文写在代码内,不推荐client=OpenAI(base_url="https://internlm-chat.intern-ai.org.cn/puyu/api/v1/",api_key=api_key)
prompt='''你好!你是谁?'''response=internlm_gen(prompt,client)
print(response)

我们可以在终端中临时将token加入变量,此时该环境变量只在当前终端内有效。所以该种方法需要我们在该终端中运行我们的py脚本。

export api_key="填入你的api token"
python internlm_test.py

若是想永久加入环境变量,可以对 ~/.bashrc 文件中添加以下命令。

export api_key="填入你的api token"

保存后记得source ~/.bashrc

运行效果如下:

Description of the image

Ch6: Python基础

本课程也提供一个简易的Python基础教程(内容较多,请前往python_intro.md浏览)。

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

History

Folders and files

NameName
Last commit message
Last commit date

parent directory

..

readme.md

Python

B站封面

Intro

欢迎来到书生浦语大模型实战营基础部分Python关卡,本关主要由以下四大块内容组成:

  • Conda虚拟环境
  • pip安装三方依赖包
  • VScode中的Python Debug
  • 调用InternLM API
  • Python基础语法

学习完成后,完成以下两个任务并经过助教批改视为闯关成功

任务类型任务内容预计耗时
闯关任务Leetcode 38315mins
闯关任务Vscode连接InternStudio debug笔记15mins

任务具体描述见task.md

TIPS:本关内容覆盖较多,知识点较杂,如果有不清楚或者不懂的地方可以随时提问。同时如果觉得教程有问题的地方也请随时提出,让我们一起把本教程优化得更好,帮助更多的人走进大模型的世界。

Ch1 Conda虚拟环境

虚拟环境是Python开发中不可或缺的一部分,它允许你在不同的项目中使用不同版本的库,避免依赖冲突。Conda是一个强大的包管理器和环境管理器。

1.1 创建新环境

首先,确保你已经安装了Anaconda或Miniconda。在开发机上已经安装好了conda,大家可以直接使用。创建虚拟环境时我们主要需要设置两个参数,一是虚拟环境的名字,二是python的版本。

conda create --name myenv python=3.9

这将创建一个名为myenv的新环境,使用Python 3.9。 在安装包时会有一步二次确认,填y就行。

1.2 环境管理

要使用创建好的虚拟环境,我们需要先激活环境。激活我们刚刚创建的myenv环境的命令如下:

conda activate myenv

如果要退出环境,回到默认环境,命令为

conda deactivate

其他常见的虚拟环境管理命令还有

#查看当前设备上所有的虚拟环境
conda env list
#查看当前环境中安装了的所有包
conda list
#删除环境(比如要删除myenv)
conda env remove myenv

1.3 安装虚拟环境到指定目录

有时我们会遇到想将整个虚拟环境保存到制定目录来共享,比如在局域网内,或者在InternStudio的团队开发机间共享。此时我们可以把conda的虚拟环境创建到指定目录下。

只需要在创建环境时使用--prefix参数制定环境所在的文件夹即可,比如我们想在/root/envs/路径下创建刚刚我们创建过得myenv(只做演示,不用操作)。

conda create --prefix /root/envs/myenv python=3.9

其他操作就与直接在默认路径下创建新环境没有区别了。想要激活保存在制定目录下的conda虚拟环境也十分简单,直接将环境名替换成所在文件夹就行。

conda activate /root/envs/myenv

myenv这个文件夹里包含了整个虚拟环境,所以理论上将他直接拷贝到任意一台安装了conda的机器上都能直接激活使用,这也是在内网机器上做环境配置的一种效率较高的解决方案。

Ch2 使用pip安装Python三方依赖包

在Python开发中,安装和管理第三方包是日常任务。pip是Python官方的包管理工具,全称为“Python Package Installer”,用于方便地安装、升级和管理Python包。

2.1 使用pip安装包

注意在使用conda的时候,我们需要先激活我们要用的虚拟环境,再在激活的虚拟环境中,使用pip来安装包。pip安装包的命令为pip install

pip install <somepackage># 安装单个包,<somepackage>替换成你要安装的包名
pip install pandas numpy # 安装多个包,如panda和numpy
pip install numpy==2.0 # 指定版本安装
pip install numpy>=1.19,<2.0 # 使用版本范围安装

2.2 安装requirement.txt

如果你有一个包含所有依赖信息的requirements.txt文件,可以使用-r一次性安装所有依赖。requirements.txt在各种开源代码中经常可以看到,里面描述了运行该代码所需要的包和对应版本。

pip install -r requirements.txt

比如以下就是我们接下来会接触到的LLM部署框架lmdeploy的requirements.txt 的一部分(只做展示,大家不用自行安装)

accelerate>=0.29.3
mmengine-lite
numpy<2.0.0
openai
peft<=0.11.1
transformers
triton>=2.1.0,<=2.3.1;

2.3 安装到指定目录

为了节省大家的存储空间,本次实战营可以直接使用share目录下的conda环境,但share目录只有读权限,所以要安装额外的包时我们不能直接使用pip将包安装到对应环境中,需要安装到我们自己的目录下。

这时我们在使用pip的时候可以使用--target-t参数来指定安装目录,此时pip会将你需要安装的包安装到你指定的目录下。

这里我们用本次实战营最常用的环境/root/share/pre_envs/pytorch2.1.2cu12.1来举例。

# 首先激活环境
conda activate /root/share/pre_envs/pytorch2.1.2cu12.1
# 创建一个目录/root/myenvs,并将包安装到这个目录下
mkdir -p /root/myenvs
pip install <somepackage> --target /root/myenvs
# 注意这里也可以使用-r来安装requirements.txt
pip install -r requirements.txt --target /root/myenvs

要使用安装在指定目录的python包,可以在python脚本开头临时动态地将该路径加入python环境变量中去

importsys# 你要添加的目录路径 your_directory='/root/myenvs'# 检查该目录是否已经在 sys.path 中 ifyour_directorynotinsys.path: # 将目录添加到 sys.path sys.path.append(your_directory) # 现在你可以直接导入该目录中的模块了 # 例如:import your_module

Ch3 使用本地Vscode连接InternStudio开发机

3.1 使用SSH连接开发机

VSCode是由微软开发一款轻量级但功能强大的代码编辑器,开源且完全免费。它拥有丰富的插件生态系统、跨平台支持、以及内置的Git控制功能,为开发者提供了高效便捷的编码体验。

VScode下载地址:Visual Studio Code - Code Editing. Redefined

首先需要安装Remote-SSH插件,安装完成后进入Remote Explorer,在ssh目录下新建一个ssh链接。

Description of the imageDescription of the image
安装Remote-SSH 进入Remote Explorer

点击+号,此时会有弹窗提示输入SSH链接命令(具体请看下文),回车后选择要更新的SSH配置文件,默认选择第一个即可(如有需要也可新建一个SSH配置文件)。

Description of the imageDescription of the image
输入链接命令 选择默认配置文件

开发机的链接命令可以在开发机控制台对应开发机"SSH连接"找到,复制登录命令到vscode的弹窗中然后回车,vscode就会开始链接InternStudio的服务器,记得此时切回去复制一下ssh的密码,待会会用到。

Description of the image

在新的弹窗中将SSH密码粘贴进去然后回车。随后会弹窗让选择远程终端的类型,选择Linux即可,因为我们的开发机是Linux系统。

首次连接会进行一些初始化设置,可能会比较慢,请耐心等待。后续打开文件夹时可能会再次需要输入密码,建议保持开发机的控制台开启以备不时之需。

当界面左下角显示远程连接地址SSH:ssh.intern-ai.org.cn时,说明连接成功。此时,我们可以像在本地使用VSCode一样,在开发机上进行各种操作。

连接成功后我们打开远程连接的vscode的extensions,在远程开发机(SSH:SSH.INTERN-AI.ORG.CN) 上安装好python的插件,后面python debug会用到。也可以一键把我们本地vscode的插件安装到开发机上。

Description of the image
Description of the image

3.2如何在Vscode中打开终端

可以有两种常用的方法打开终端:

  1. 单击VSCode页面底部状态栏中的“终端”图标(通常显示为两个图标一个X和一个),可以快速打开VSCode的终端面板。
  2. 使用快捷键Ctrl+`(反引号,tab键上面那一个),也可以快速打开VSCode的终端面板。

TIPS:终端面板右上方的+可以新建一个TERMINAL。

Ch4 使用vscode连接开发机进行python debug

4.1 什么是debug?

当你刚开始学习Python编程时,可能会遇到代码不按预期运行的情况。这时,你就需要用到“debug”了。简单来说,“debug”就是能再程序中设置中断点并支持一行一行地运行代码,观测程序中变量的变化,然后找出并修正代码中的错误。而VSCode提供了一个非常方便的debug工具,可以帮助你更容易地找到和修复错误。

4.2 使用Vscode进行Python debug的流程

4.2.1 debug单个python文件

defrange_sum(start,end):
sum_res=0foriinrange(start,end):
sum_res+=ireturnsum_resif__name__=="__main__":
print(range_sum(1,10))

Step1.安装Python扩展

  • 打开VSCode,点击左侧扩展栏,搜索Python,并安装。

Step2配置调试

  • 打开你的Python文件,点击左侧活动栏的“运行和调试”图标。
  • 首次debug需要配置以下,点击“create a launch.json file”,选择python debugger后选择“Python File” config。
Description of the image
  • 可以直接编辑生成的launch.json文件,配置调试参数,比如添加config(Add Configuration)等。
Description of the image

新建python文件后我们如果想要运行,首先需要选择解释器。单击右下角的select interpreter,vsconde会自动扫描开发机上所有的python环境中的解释器。

Step3.设置断点

在代码行号旁边点击,可以添加一个红点,这就是断点(如果不能添加红点需要检查一下Python扩展是否已经正确安装)。当代码运行到这里时,它会停下来,这样你就可以检查变量的值、执行步骤等。接下来,我们在第4行的核心代码处打上断点。

Description of the image

Step4.启动debug

点击VSCode侧边栏的“Run and Debug”(运行和调试),选择调试配置后,点击绿色箭头(开始调试)按钮,或者按F5键。

Description of the image

Step5.查看变量

当代码在断点处停下来时,你可以查看和修改变量的值。在“Run and Debug”侧边栏的“Variables”(变量)部分,你可以看到当前作用域内的所有变量及其值。

Description of the image

Step6.单步执行代码

你可以使用顶部的debug面板的按钮来单步执行代码。这样,你可以逐行运行代码,并查看每行代码执行后的效果。

Description of the image

debug面板各按钮功能介绍:

  1. continue: 继续运行到下一个断点。

  2. step over: 单步跳过,可以理解为运行当前行代码,不进入具体的函数或者方法。

  3. step into: 单步进入。如果当前行代码存在函数调用,则进入该函数内部。如果当前行代码没有函数调用,则等价于step over

  4. step out: 单步退出函数,返回到调用该函数的上一层代码。

  5. restart: 重新启动调试。

  6. stop: 终止调试。

Step7.修复错误并重新运行

如果你找到了代码中的错误,可以修复它,然后重新运行debug来确保问题已经被解决。

通过遵循以上步骤,你可以使用VSCode的debug功能来更容易地找到和修复你Python代码中的错误。可以自己编写一个简单的python脚本,并尝试使用debug来更好的理解代码的运行逻辑。记住,debug是编程中非常重要的一部分,所以不要怕花时间在这上面。随着时间的推移,你会变得越来越擅长它!

4.2.2 不同的断点

在调试(Debug)过程中,断点(Breakpoint)允许程序员在程序的执行流程中设置暂停点。当程序运行到这些断点时,执行会暂时中断,使得我们可以检查此时程序的状态,包括变量的值、内存的内容等。断点为我们提供了一个观察程序运行细节的机会,从而帮助我们定位和解决程序中的错误或问题。在VSCode中,我们还可以设置条件断点,这样断点只有在满足特定条件时才会触发。

  1. 普通断点:在代码行号左侧点击,添加断点。
  2. 条件断点:在断点标记上右键,选择条件断点(conditional breakpoint)。VSCode 中常用的条件断点主要有三种类型:
    1. 表达式(Expression):输入一个 Python 表达式,每次触发断点时运行该表达式,当表达式的值为 True 时 VS Code 会暂停执行。例如:x == 10
    2. 触发计数(Hit Count):断点触发计数达到输入值时才会暂停运行。
    3. 记录日志(Log Message):触发该断点时在 Debug Console 中输出指定信息,实际上就是 logpoint。需要输入要输出的信息,如果要用到表达式,可以使用 {} 将表达式括起来。例如,每次记录变量 i 的值可以写 x={i}

表达式条件断点

比如我们想让代码在 i=end-1 时停下来,可以这样设置: 在断点处右键选择“条件断点”,然后输入条件 i == end-1

Description of the image

回车保存断点,然后运行debug,可以看到程序在i=9的时候停了下来,此时各变量的值如下

Description of the image

触发计数条件断点

如果我们想让sum_res+=i在运行5次后停下来,我们可以在这行设置Hit count断点为5。

Description of the image

运行debug后,程序第一次暂停时各变量的状态为

Description of the image

记录日志条件断点

在Log Message输入 Current i is {i} 每次触发时记录一下 i 的值

Description of the image

运行debug后我们可以在终端面板的debug console看到

Description of the image

4.3 在vscode使用命令行进行debug

很多时候我们要debug的不止是一个简单的python文件,而是很多参数,参数中不止会有简单的值还可能有错综复杂的文件关系,甚至debug一整个项目。这种情况下,直接使用命令行来发起debug会是一个更好的选择。

4.3.1 vscode设置

vscode支持通过remote的方法连接我们在命令行中发起的debug server。首先我们要配置一下debug的config。

还是点击VSCode侧边栏的“Run and Debug”(运行和调试),单击"create a lauch.json file"

选择debugger时选择python debuger。选择debug config时选择remote attach就行,随后会让我们选择debug server的地址,因为我们是在本地debug,所以全都保持默认直接回车就可以了,也就是我们的server地址为 localhost:5678

Description of the image

配置完以后会打开配置的json文件,但这不是重点,可以关掉。这时我们会看到run and debug界面有变化,出现了debug选项。

Description of the image

4.3.2 debug命令行

现在vscode已经准备就绪,让我们来看看如何在命令行中发起debug。如果没有安装debugpy的话可以先通过pip install debugpy安装一下。

python -m debugpy --listen 5678 --wait-for-client ./myscript.py
  • ./myscript.py可以替换为我们想要debug的python文件,后面可以和直接在命令行中启动python一样跟上输入的参数。记得要先在想要debug的python文件打好断点并保存。

  • --wait-for-client参数会让我们的debug server在等客户端连入后才开始运行debug。在这就是要等到我们在run and debug界面启动debug。

先在终端中发起debug server,然后再去vscode debug页面单击一下绿色箭头开启debug。

Description of the image

接下来的操作就和上面一样了。

4.3.3 使用别名简化命令

这边有个不方便的地方,python -m debugpy --listen 5678 --wait-for-client这个命令太长了,每次都打很麻烦。这里我们可以给这段常用的命令设置一个别名。

linux系统中,可以对 ~/.bashrc 文件中添加以下命令

alias pyd='python -m debugpy --wait-for-client --listen 5678'

然后执行

source~/.bashrc

这样之后使用 pyd 命令(你可以自己命名) 替代 python 就能在命令行中起debug了,之前的debug命令就变成了

pyd ./myscript.py

Ch5 Python调用InternLM api

5.1 如何获取api key

前往书生浦语的API文档,登陆后点击API tokens。初次使用可能会需要先填写邀请码。

Description of the image

然后创建一个新的api token。

Description of the image
Description of the image

这里一定要注意,浦语的token只有刚创建的时候才能看到全文,后续没法再查看已经创建好的token,如果忘记需要重新创建,所以创建完了以后记得先复制保存到本地。

5.2 如何使用InternLM api

我们可以使用openai python sdk来调用InternLM api。注意在配置api key时,更推荐使用环境变量来配置以避免token泄露。

#./internlm_test.pyfromopenaiimportOpenAIimportosdefinternlm_gen(prompt,client):
''' LLM生成函数 Param prompt: prompt string Param client: OpenAI client  '''response=client.chat.completions.create(
model="internlm2.5-latest",
messages=[
{"role": "user", "content": prompt},
],
stream=False
)
returnresponse.choices[0].message.contentapi_key=os.getenv('api_key')
#api_key = "" #也可以明文写在代码内,不推荐client=OpenAI(base_url="https://internlm-chat.intern-ai.org.cn/puyu/api/v1/",api_key=api_key)
prompt='''你好!你是谁?'''response=internlm_gen(prompt,client)
print(response)

我们可以在终端中临时将token加入变量,此时该环境变量只在当前终端内有效。所以该种方法需要我们在该终端中运行我们的py脚本。

export api_key="填入你的api token"
python internlm_test.py

若是想永久加入环境变量,可以对 ~/.bashrc 文件中添加以下命令。

export api_key="填入你的api token"

保存后记得source ~/.bashrc

运行效果如下:

Description of the image

Ch6: Python基础

本课程也提供一个简易的Python基础教程(内容较多,请前往python_intro.md浏览)。