永州网站建设多少钱,最近发生的重大新闻事件,江苏营销型网站,如何用2级域名做网站一、关卡任务
基础任务#xff08;完成此任务即完成闯关#xff09;
使用结合W4A16量化与kv cache量化的internlm2_5-7b-chat模型封装本地API并与大模型进行一次对话#xff0c;作业截图需包括显存占用情况与大模型回复#xff0c;参考4.1 API开发(优秀学员必做)使用Func…一、关卡任务
基础任务完成此任务即完成闯关
使用结合W4A16量化与kv cache量化的internlm2_5-7b-chat模型封装本地API并与大模型进行一次对话作业截图需包括显存占用情况与大模型回复参考4.1 API开发(优秀学员必做)使用Function call功能让大模型完成一次简单的加与乘函数调用作业截图需包括大模型回复的工具调用情况参考4.2 Function call(选做)
二、实验过程
2.1 配置LMDeploy环境
点选开发机自拟一个开发机名称选择Cuda12.2-conda镜像。
我们要运行参数量为7B的InternLM2.5由InternLM2.5的码仓查询InternLM2.5-7b-chat的config.json文件可知该模型的权重被存储为bfloat16格式 对于一个7B70亿参数的模型每个参数使用16位浮点数等于 2个 Byte表示则模型的权重大小约为
70×10^9 parameters×2 Bytes/parameter14GB
70亿个参数×每个参数占用2个字节14GB
所以我们需要大于14GB的显存选择 30%A100*1(24GB显存容量)后选择立即创建等状态栏变成运行中点击进入开发机我们即可开始部署。
在终端中让我们输入以下指令来创建一个名为lmdeploy的conda环境python版本为3.10创建成功后激活环境并安装0.5.3版本的lmdeploy及相关包。
conda create -n lmdeploy python3.10 -y
conda activate lmdeploy
conda install pytorch2.1.2 torchvision0.16.2 torchaudio2.1.2 pytorch-cuda12.1 -c pytorch -c nvidia -y
pip install timm1.0.8 openai1.40.3 lmdeploy[all]0.5.3
2.2 InternStudio环境获取模型
为方便文件管理我们需要一个存放模型的目录本教程统一放置在/root/models/目录。
运行以下命令创建文件夹并设置开发机共享目录的软链接。
mkdir /root/models
ln -s /root/share/new_models//Shanghai_AI_Laboratory/internlm2_5-7b-chat /root/models
ln -s /root/share/new_models/OpenGVLab/InternVL2-26B /root/models
此时我们可以看到/root/models中会出现internlm2_5-7b-chat和InternVL2-26B文件夹。 2.3 LMDeploy验证启动模型文件
在量化工作正式开始前我们还需要验证一下获取的模型文件能否正常工作以免竹篮打水一场空。
让我们进入创建好的conda环境并启动InternLM2_5-7b-chat
conda activate lmdeploy
lmdeploy chat /root/models/internlm2_5-7b-chat
稍待片刻启动成功后会显示如下。 此时我们可以在CLI(“命令行界面” Command Line Interface的缩写)中和InternLM2.5尽情对话了注意输入内容完成后需要按两次回车才能够执行以下为示例。 不知道有没有小伙伴注意到屏幕右上角这是InternStudio提供的资源监控。 请记住现在显存占用约23GB先圈起来待会要用上。
如果选择 50%A100*1 建立机器同样运行InternLM2.5 7B模型会发现此时显存占用为36GB 那么这是为什么呢由上文可知上文可知上文可知InternLM2.5 7B模型为bf16LMDpeloy推理精度为bf16的7B模型权重需要占用14GB显存如下图所示lmdeploy默认设置cache-max-entry-count为0.8即kv cache占用剩余显存的80%
此时对于24GB的显卡即30%A100权重占用14GB显存剩余显存24-1410GB因此kv cache占用10GB*0.88GB加上原来的权重14GB总共占用14822GB。
而对于40GB的显卡即50%A100权重占用14GB剩余显存40-1426GB因此kv cache占用26GB*0.820.8GB加上原来的权重14GB总共占用34.8GB。
实际加载模型后其他项也会占用部分显存因此剩余显存比理论偏低实际占用会略高于22GB和34.8GB。 此外如果想要实现显存资源的监控我们也可以新开一个终端输入如下两条指令的任意一条查看命令输入时的显存占用情况。
nvidia-smi
studio-smi 注释实验室提供的环境为虚拟化的显存nvidia-smi是NVIDIA GPU驱动程序的一部分用于显示NVIDIA GPU的当前状态故当前环境只能看80GB单卡 A100 显存使用情况无法观测虚拟化后30%或50%A100等的显存情况。针对于此实验室提供了studio-smi 命令工具能够观测到虚拟化后的显存使用情况。
2.4 LMDeploy API部署InternLM2.5
在上一章节我们直接在本地部署InternLM2.5。而在实际应用中我们有时会将大模型封装为API接口服务供客户端访问。
2.4.1 启动API服务器
首先让我们进入创建好的conda环境并通下命令启动API服务器部署InternLM2.5模型
conda activate lmdeploy
lmdeploy serve api_server \/root/models/internlm2_5-7b-chat \--model-format hf \--quant-policy 0 \--server-name 0.0.0.0 \--server-port 23333 \--tp 1
命令解释
lmdeploy serve api_server这个命令用于启动API服务器。/root/models/internlm2_5-7b-chat这是模型的路径。--model-format hf这个参数指定了模型的格式。hf代表“Hugging Face”格式。--quant-policy 0这个参数指定了量化策略。--server-name 0.0.0.0这个参数指定了服务器的名称。在这里0.0.0.0是一个特殊的IP地址它表示所有网络接口。--server-port 23333这个参数指定了服务器的端口号。在这里23333是服务器将监听的端口号。--tp 1这个参数表示并行数量GPU数量。
稍待片刻终端显示如下。 这一步由于部署在远程服务器上所以本地需要做一下ssh转发才能直接访问。在你本地打开一个cmd或powershell窗口输入命令如下 ssh -CNg -L 23333:127.0.0.1:23333 rootssh.intern-ai.org.cn -p 你的ssh端口号 然后打开浏览器访问http://127.0.0.1:23333看到如下界面即代表部署成功。 2.4.2 以命令行形式连接API服务器
关闭http://127.0.0.1:23333网页但保持终端和本地窗口不动按箭头操作新建一个终端。
运行如下命令激活conda环境并启动命令行客户端。
conda activate lmdeploy
lmdeploy serve api_client http://localhost:23333
稍待片刻等出现double enter to end input 的输入提示即启动成功此时便可以随意与InternLM2.5对话同样是两下回车确定输入exit退出。 2.4.3 以Gradio网页形式连接API服务器
保持第一个终端不动在新建终端中输入exit退出。
输入以下命令使用Gradio作为前端启动网页。
lmdeploy serve gradio http://localhost:23333 \--server-name 0.0.0.0 \--server-port 6006
稍待片刻等终端如下图所示便保持两个终端不动。 关闭之前的cmd/powershell窗口重开一个再次做一下ssh转发(因为此时端口不同)。在你本地打开一个cmd或powershell窗口输入命令如下。
ssh -CNg -L 6006:127.0.0.1:6006 rootssh.intern-ai.org.cn -p 你的ssh端口号重复上述操作待窗口保持在如下状态即可。 打开浏览器访问地址http://127.0.0.1:6006然后就可以与模型尽情对话了。 2.5 LMDeploy Lite
随着模型变得越来越大我们需要一些大模型压缩技术来降低模型部署的成本并提升模型的推理性能。LMDeploy 提供了权重量化和 k/v cache两种策略。
2.5.1 设置最大kv cache缓存大小
kv cache是一种缓存技术通过存储键值对的形式来复用计算结果以达到提高性能和降低内存消耗的目的。在大规模训练和推理中kv cache可以显著减少重复计算量从而提升模型的推理速度。理想情况下kv cache全部存储于显存以加快访存速度。
模型在运行时占用的显存可大致分为三部分模型参数本身占用的显存、kv cache占用的显存以及中间运算结果占用的显存。LMDeploy的kv cache管理器可以通过设置--cache-max-entry-count参数控制kv缓存占用剩余显存的最大比例。默认的比例为0.8。
首先我们先来回顾一下InternLM2.5正常运行时占用显存。 占用了23GB那么试一试执行以下命令再来观看占用显存情况。
lmdeploy chat /root/models/internlm2_5-7b-chat --cache-max-entry-count 0.4稍待片刻观测显存占用情况可以看到减少了约4GB的显存。 让我们计算一下4GB显存的减少缘何而来
对于修改kv cache默认占用之前即如1.3 LMDeploy验证启动模型文件所示直接启动模型的显存占用情况(23GB)
1、在 BF16 精度下7B模型权重占用14GB70×10^9 parameters×2 Bytes/parameter14GB
2、kv cache占用8GB剩余显存24-1410GBkv cache默认占用80%即10*0.88GB
3、其他项1GB
是故23GB权重占用14GBkv cache占用8GB其它项1GB
对于修改kv cache占用之后的显存占用情况(19GB)
1、与上述声明一致在 BF16 精度下7B模型权重占用14GB
2、kv cache占用4GB剩余显存24-1410GBkv cache修改为占用40%即10*0.44GB
3、其他项1GB
是故19GB权重占用14GBkv cache占用4GB其它项1GB
而此刻减少的4GB显存占用就是从10GB*0.8-10GB*0.44GB这里计算得来。
2.5.2 设置在线 kv cache int4/int8 量化
自 v0.4.0 起LMDeploy 支持在线 kv cache int4/int8 量化量化方式为 per-head per-token 的非对称量化。此外通过 LMDeploy 应用 kv 量化非常简单只需要设定 quant_policy 和cache-max-entry-count参数。目前LMDeploy 规定 qant_policy4 表示 kv int4 量化quant_policy8 表示 kv int8 量化。
我们通过2.1 LMDeploy API部署InternLM2.5的实践为例输入以下指令启动API服务器。
lmdeploy serve api_server \/root/models/internlm2_5-7b-chat \--model-format hf \--quant-policy 4 \--cache-max-entry-count 0.4\--server-name 0.0.0.0 \--server-port 23333 \--tp 1
稍待片刻显示如下即代表服务启动成功。 想要和此时的模型对话的话可以回顾2.1.2 以命令行形式连接API服务器或者2.1.3 以Gradio网页形式连接API服务器的内容自行对话步骤完全一致本章主要观测显存状态。
可以看到此时显存占用约19GB相较于1.3 LMDeploy验证启动模型文件直接启动模型的显存占用情况(23GB)减少了4GB的占用。此时4GB显存的减少逻辑与2.2.1 设置最大kv cache缓存大小中4GB显存的减少一致均因设置kv cache占用参数cache-max-entry-count至0.4而减少了4GB显存占用。 那么本节中19GB的显存占用与[2.2.1 设置最大kv cache缓存大小](#2.2.1 23)中19GB的显存占用区别何在呢
由于都使用BF16精度下的internlm2.5 7B模型故剩余显存均为10GB且 cache-max-entry-count 均为0.4这意味着LMDeploy将分配40%的剩余显存用于kv cache即10GB*0.44GB。但quant-policy 设置为4时意味着使用int4精度进行量化。因此LMDeploy将会使用int4精度提前开辟4GB的kv cache。
相比使用BF16精度的kv cacheint4的Cache可以在相同4GB的显存下只需要4位来存储一个数值而BF16需要16位。这意味着int4的Cache可以存储的元素数量是BF16的四倍。
相当于提前占用了4GB的显存只不过这个4GB能存储的信息比之前多了4倍。
2.5.3 W4A16 模型量化和部署
准确说模型量化是一种优化技术旨在减少机器学习模型的大小并提高其推理速度。量化通过将模型的权重和激活从高精度如16位浮点数转换为低精度如8位整数、4位整数、甚至二值网络来实现。
那么标题中的W4A16又是什么意思呢
W4这通常表示权重量化为4位整数int4。这意味着模型中的权重参数将从它们原始的浮点表示例如FP32、BF16或FP16Internlm2.5精度为BF16转换为4位的整数表示。这样做可以显著减少模型的大小。A16这表示激活或输入/输出仍然保持在16位浮点数例如FP16或BF16。激活是在神经网络中传播的数据通常在每层运算之后产生。
因此W4A16的量化配置意味着
权重被量化为4位整数。激活保持为16位浮点数。
让我们回到LMDeploy在最新的版本中LMDeploy使用的是AWQ算法能够实现模型的4bit权重量化。输入以下指令执行量化工作。(本步骤耗时较长请耐心等待)
AWQ算法核心思想不是所有的权重都同等重要。1%的权重参数可能会主导模型量化过程中的损失。保留这些参数的精度FP16会极大程度保护模型的性能。
lmdeploy lite auto_awq \/root/models/internlm2_5-7b-chat \--calib-dataset ptb \--calib-samples 128 \--calib-seqlen 2048 \--w-bits 4 \--w-group-size 128 \--batch-size 1 \--search-scale False \--work-dir /root/models/internlm2_5-7b-chat-w4a16-4bit
命令解释
lmdeploy lite auto_awq: lite这是LMDeploy的命令用于启动量化过程而auto_awq代表自动权重量化auto-weight-quantization。/root/models/internlm2_5-7b-chat: 模型文件的路径。--calib-dataset ptb: 这个参数指定了一个校准数据集这里使用的是’ptb’Penn Treebank一个常用的语言模型数据集。--calib-samples 128: 这指定了用于校准的样本数量—128个样本--calib-seqlen 2048: 这指定了校准过程中使用的序列长度—1024--w-bits 4: 这表示权重weights的位数将被量化为4位。--work-dir /root/models/internlm2_5-7b-chat-w4a16-4bit: 这是工作目录的路径用于存储量化后的模型和中间结果。
等终端输出如下时说明正在推理中稍待片刻。 出现报错信息
ValueError: The repository for ptb_text_only contains custom code which must be executed to correctly load the dataset. You can inspect the repository content at https://hf.co/datasets/ptb_text_only. Please pass the argument trust_remote_codeTrue to allow custom code to be run. 解决办法
可能是网络波动原因重新换一个终端运行就解决了。 要等待非常非常非常久~~~ 等待推理完成便可以直接在你设置的目标文件夹看到对应的模型文件。
那么推理后的模型和原本的模型区别在哪里呢最明显的两点是模型文件大小以及占据显存大小。
我们可以输入如下指令查看在当前目录中显示所有子目录的大小。
cd /root/models/
du -sh *
输出结果如下。(其余文件夹都是以软链接的形式存在的不占用空间故显示为0) 那么原模型大小呢输入以下指令查看。
cd /root/share/new_models/Shanghai_AI_Laboratory/
du -sh *
终端输出结果如下。 一经对比即可发觉15G对4.9G优势在我。
那么显存占用情况对比呢输入以下指令启动量化后的模型。
lmdeploy chat /root/models/internlm2_5-7b-chat-w4a16-4bit/ --model-format awq
稍待片刻我们直接观测右上角的显存占用情况。 可以发现相比较于原先的23GB显存占用W4A16量化后的模型少了约2GB的显存占用。
让我们计算一下2GB显存的减少缘何而来。
对于W4A16量化之前即如1.3 LMDeploy验证启动模型文件所示直接启动模型的显存占用情况(23GB)
1、在 BF16 精度下7B模型权重占用14GB70×10^9 parameters×2 Bytes/parameter14GB
2、kv cache占用8GB剩余显存24-1410GBkv cache默认占用80%即10*0.88GB
3、其他项1GB
是故23GB权重占用14GBkv cache占用8GB其它项1GB
而对于W4A16量化之后的显存占用情况(20.9GB)
1、在 int4 精度下7B模型权重占用3.5GB14/43.5GB
注释
bfloat16是16位的浮点数格式占用2字节16位的存储空间。int4是4位的整数格式占用0.5字节4位的存储空间。因此从bfloat16到int4的转换理论上可以将模型权重的大小减少到原来的1/4即7B个int4参数仅占用3.5GB的显存。
2、kv cache占用16.4GB剩余显存24-3.520.5GBkv cache默认占用80%即20.5*0.816.4GB
3、其他项1GB
是故20.9GB权重占用3.5GBkv cache占用16.4GB其它项1GB
2.5.4 W4A16 量化 KV cacheKV cache 量化
我知道你们肯定有人在想介绍了那么多方法能不能全都要当然可以
输入以下指令让我们同时启用量化后的模型、设定kv cache占用和kv cache int4量化。
lmdeploy serve api_server \/root/models/internlm2_5-7b-chat-w4a16-4bit/ \--model-format awq \--quant-policy 4 \--cache-max-entry-count 0.4\--server-name 0.0.0.0 \--server-port 23333 \--tp 1
此时显存占用13.5GB。 让我们来计算一下此刻的显存占用情况(13.5GB): 1、在 int4 精度下7B模型权重占用3.5GB14/43.5GB 2、kv cache占用16.4GB剩余显存24-3.520.5GBkv cache占用40%即20.5*0.48.2GB 3、其他项1.8GB 是故13.5GB权重占用3.5GBkv cache占用8.2GB其它项1.8GB
想要更极限且保证正常工作的量化设置的话各位小伙伴可以之后自行探索本次实践教学便止步于此了。
2.6 LMDeploy Lite
本次实践选用InternVL2-26B进行演示其实就根本来说作为一款VLM和上述的InternLM2.5在操作上并无本质区别仅是多出了图片输入这一额外步骤但作为量化部署进阶实践选用InternVL2-26B目的是带领大家体验一下LMDeploy的量化部署可以做到何种程度。
2.6.1 W4A16 模型量化和部署
针对InternVL系列模型让我们先进入conda环境并输入以下指令执行模型的量化工作。(本步骤耗时较长请耐心等待)
conda activate lmdeploy
lmdeploy lite auto_awq \/root/models/InternVL2-26B \--calib-dataset ptb \--calib-samples 128 \--calib-seqlen 2048 \--w-bits 4 \--w-group-size 128 \--batch-size 1 \--search-scale False \--work-dir /root/models/InternVL2-26B-w4a16-4bit
等终端输出如下时说明正在推理中稍待片刻。 一样是非常久可能要等待半天 终于好了
等待推理完成便可以在左侧/models内直接看到对应的模型文件。 2.6.2 W4A16 量化 KV cacheKV cache 量化
输入以下指令让我们启用量化后的模型。
lmdeploy serve api_server \/root/models/InternVL2-26B-w4a16-4bit \--model-format awq \--quant-policy 4 \--cache-max-entry-count 0.1\--server-name 0.0.0.0 \--server-port 23333 \--tp 1
启动后观测显存占用情况此时只需要约23.8GB的显存已经是一张30%A100即可部署的模型了。 根据InternVL2介绍InternVL2 26B是由一个6B的ViT、一个100M的MLP以及一个19.86B的internlm组成的。
让我们来计算一下使用A100 80GB直接启动模型的显存占用情况 1、在 fp16 精度下6BViT模型权重占用12GB60×10^9 parameters×2 Bytes/parameter12GB 2、在 fp16 精度下19.86B≈20B的internlm模型权重占用40GB200×10^9 parameters×2 Bytes/parameter40GB 3、kv cache占用22.4GB剩余显存80-12-4028GBkv cache默认占用80%即28*0.822.4GB 4、其他项 是故总占用Vit权重占用12GBinternlm模型权重占用40GBkv cache占用22.4GB其他项≥74.4GB 对于使用30%A100*1(24GB显存容量)联合部署的显存情况(23.8GB) 1、在 fp16 精度下6BViT模型权重占用12GB60×10^9 parameters×2 Bytes/parameter12GB (ViT使用精度为fp16的pytorch推理量化只对internlm起效果) 2、在 int4 精度下19.86B≈20B的internlm模型权重占用10GB200×10^9 parameters×0.5 Bytes/parameter10GB 3、kv cache占用0.2GB剩余显存24-12-102GBkv cache修改为占用10%即2*0.10.2GB 4、其他项1.6GB 是故23.8GBVit权重占用12GBinternlm模型权重占用10GBkv cache占用0.2GB其他项1.6GB
如果此时推理图片则会显示剩余显存不足这是因为推理图片的时候pytorch会占用额外的激活显存故有需要的小伙伴可以开启50%A100进行图片推理。
2.6.3 LMDeploy API部署InternVL2
具体封装操作与之前大同小异仅仅在数个指令细节上作调整故本章节大部分操作与2.1 LMDeploy API部署InternLM2.5中几近完全一样同学们可自行依葫芦画瓢以下教程仅做参考。
通过以下命令启动API服务器部署InternVL2模型
lmdeploy serve api_server \/root/models/InternVL2-26B-w4a16-4bit/ \--model-format awq \--quant-policy 4 \--cache-max-entry-count 0.6 \--server-name 0.0.0.0 \--server-port 23333 \--tp 1
其余步骤与2.1.1 启动API服务器剩余内容一致。
命令行形式、Gradio网页形式连接操作与
2.1.2 以命令行形式连接API服务器
2.1.3 以Gradio网页形式连接API服务器
步骤流程、指令完全一致不再赘述。
以下为Gradio网页形式连接成功后对话截图。 2.7 LMDeploy之FastAPI与Function call
之前在2.1.1 启动API服务器与3.2 LMDeploy API部署InternVL2均是借助FastAPI封装一个API出来让LMDeploy自行进行访问在这一章节中我们将依托于LMDeploy封装出来的API进行更加灵活更具DIY的开发。
2.7.1 API开发
与之前一样让我们进入创建好的conda环境并输入指令启动API服务器。
conda activate lmdeploy
lmdeploy serve api_server \/root/models/internlm2_5-7b-chat-w4a16-4bit \--model-format awq \--cache-max-entry-count 0.4 \--quant-policy 4 \--server-name 0.0.0.0 \--server-port 23333 \--tp 1
保持终端窗口不动新建一个终端。 在新建终端中输入如下指令新建internlm2_5.py。
touch /root/internlm2_5.py
此时我们可以在左侧的File Broswer中看到internlm2_5.py文件双击打开。
将以下内容复制粘贴进internlm2_5.py。
# 导入openai模块中的OpenAI类这个类用于与OpenAI API进行交互
from openai import OpenAI# 创建一个OpenAI的客户端实例需要传入API密钥和API的基础URL
client OpenAI(api_keyYOUR_API_KEY, # 替换为你的OpenAI API密钥由于我们使用的本地API无需密钥任意填写即可base_urlhttp://0.0.0.0:23333/v1 # 指定API的基础URL这里使用了本地地址和端口
)# 调用client.models.list()方法获取所有可用的模型并选择第一个模型的ID
# models.list()返回一个模型列表每个模型都有一个id属性
model_name client.models.list().data[0].id# 使用client.chat.completions.create()方法创建一个聊天补全请求
# 这个方法需要传入多个参数来指定请求的细节
response client.chat.completions.create(modelmodel_name, # 指定要使用的模型IDmessages[ # 定义消息列表列表中的每个字典代表一个消息{role: system, content: 你是一个友好的小助手负责解决问题.}, # 系统消息定义助手的行为{role: user, content: 帮我讲述一个关于狐狸和西瓜的小故事}, # 用户消息询问时间管理的建议],temperature0.8, # 控制生成文本的随机性值越高生成的文本越随机top_p0.8 # 控制生成文本的多样性值越高生成的文本越多样
)# 打印出API的响应结果
print(response.choices[0].message.content)
按CtrlS键保存Mac用户按CommandS。 现在让我们在新建终端输入以下指令激活环境并运行python代码。
conda activate lmdeploy
python /root/internlm2_5.py
终端会输出如下结果。 2.7.2 Function call
关于Function call即函数调用功能它允许开发者在调用模型时详细说明函数的作用并使模型能够智能地根据用户的提问来输入参数并执行函数。完成调用后模型会将函数的输出结果作为回答用户问题的依据。
首先让我们进入创建好的conda环境并启动API服务器。
conda activate lmdeploy
lmdeploy serve api_server \/root/models/internlm2_5-7b-chat \--model-format hf \--quant-policy 0 \--server-name 0.0.0.0 \--server-port 23333 \--tp 1
目前LMDeploy在0.5.3版本中支持了对InternLM2, InternLM2.5和llama3.1这三个模型故我们选用InternLM2.5 封装API。
让我们使用一个简单的例子作为演示。输入如下指令新建internlm2_5_func.py。
touch /root/internlm2_5_func.py
双击打开并将以下内容复制粘贴进internlm2_5_func.py。
from openai import OpenAIdef add(a: int, b: int):return a bdef mul(a: int, b: int):return a * btools [{type: function,function: {name: add,description: Compute the sum of two numbers,parameters: {type: object,properties: {a: {type: int,description: A number,},b: {type: int,description: A number,},},required: [a, b],},}
}, {type: function,function: {name: mul,description: Calculate the product of two numbers,parameters: {type: object,properties: {a: {type: int,description: A number,},b: {type: int,description: A number,},},required: [a, b],},}
}]
messages [{role: user, content: Compute (35)*2}]client OpenAI(api_keyYOUR_API_KEY, base_urlhttp://0.0.0.0:23333/v1)
model_name client.models.list().data[0].id
response client.chat.completions.create(modelmodel_name,messagesmessages,temperature0.8,top_p0.8,streamFalse,toolstools)
print(response)
func1_name response.choices[0].message.tool_calls[0].function.name
func1_args response.choices[0].message.tool_calls[0].function.arguments
func1_out eval(f{func1_name}(**{func1_args}))
print(func1_out)messages.append({role: assistant,content: response.choices[0].message.content
})
messages.append({role: environment,content: f35{func1_out},name: plugin
})
response client.chat.completions.create(modelmodel_name,messagesmessages,temperature0.8,top_p0.8,streamFalse,toolstools)
print(response)
func2_name response.choices[0].message.tool_calls[0].function.name
func2_args response.choices[0].message.tool_calls[0].function.arguments
func2_out eval(f{func2_name}(**{func2_args}))
print(func2_out)
按CtrlS键保存Mac用户按CommandS。 现在让我们输入以下指令运行python代码。
python /root/internlm2_5_func.py稍待片刻终端输出如下。 我们可以看出InternLM2.5将输入Compute (35)*2根据提供的function拆分成了加和乘两步第一步调用function add实现加再于第二步调用function mul实现乘再最终输出结果16.