Skip to content

Latest commit

 

History

History
633 lines (469 loc) · 27.6 KB

readme.md

File metadata and controls

633 lines (469 loc) · 27.6 KB

Python

B站封面

Intro

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

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

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

任务类型 任务内容 预计耗时
闯关任务 Leetcode 383 15mins
闯关任务 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环境变量中去

import sys  
  
# 你要添加的目录路径  
your_directory = '/root/myenvs'  
  
# 检查该目录是否已经在 sys.path 中  
if your_directory not in sys.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 image Description of the image
安装Remote-SSH 进入Remote Explorer

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

Description of the image Description 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中选择conda虚拟环境

当我们新建完一个python文件后,需要在右下角单击选择我们的python解释器才能运行。这边我们会看到当前本机上已经安装好的所有python解释器,直接选择要使用的环境中的解释器就行。

Description of the image

3.3如何在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文件

def range_sum(start,end):
    sum_res = 0
    for i in range(start,end):
        sum_res+=i
    return sum_res

if __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 debugger。选择debug config时选择remote attach就行,随后会让我们选择debug server的地址,因为我们是在本地debug,所以全都保持默认直接回车就可以了,也就是我们的server地址为 localhost:5678

Description of the image

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

Description of the image

注意:已经有配置好的json文件

如果有已经配置好的debug json配置文件,则需要在原json上增加配置。可以通过Run and Debug卡片左上角的下拉菜单单击Add configuration,或者点击设置按钮打开配置文件,在配置文件的右下角也会有一个Add configuration。剩下的步骤就和前面一样选择Python debugger-Remote attach,剩下的全都保持默认直接回车就可以了,也就是我们的server地址为 localhost:5678

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方式运行的时候可能会报以下warning。此时,debug可能不能正常运行,需要按他提示的给python加上-Xfrozen_modules=off参数禁用冻结模块即可。

Debugger warning: It seems that frozen modules are being used, which may make the debugger miss breakpoints. Please pass -Xfrozen_modules=off to python to disable frozen modules.
python -m -Xfrozen_modules=off debugpy --listen 5678 --wait-for-client ./myscript.py

先在终端中发起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.py
from openai import OpenAI
import os
def internlm_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
    )
    return response.choices[0].message.content

api_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浏览)。