欺诈文本分类检测(十八):基于llama.cpp+CPU推理

1. 前言

前文我们用Lora训练出自己的个性化模型后,首先面临的问题是:如何让模型在普通机器上跑起来?毕竟模型微调时都是在几十G的专用GPU上训练的,如果换到只有CPU的普通电脑上,可能会面临几秒蹦一个词的尴尬问题。

LLama.cpp项目就是来解决这个问题的,它是由Georgi Gerganov开发的一个开源工具,主要用于将大语言模型(LLM)转换为C++代码,使它们可以在任意的CPU设备上运行。
在这里插入图片描述

它的优势在于:

  • 无需依赖pytorch和python,而是以c++编译的可执行文件来运行。
  • 支持丰富的硬件设备,包括Nvidia、AMD、Intel、Apple Silicon、华为昇腾等芯片。
  • 支持f16和f32混合精度,也支持8位、4位甚至1位的量化来加快推理。
  • 无需GPU,可只用CPU运行,甚至可以在Android设备上运行。

本文我们将用llama.cpp来运行之前微调过的欺诈文本分类模型。

2. 安装

我们使用本地编译的方式来安装llama.cpp,克隆仓库源代码,并进入llama.cpp目录:

git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp

在这里插入图片描述
make命令执行编译:
在这里插入图片描述编译完会多出很多工具文件:
在这里插入图片描述

安装所有依赖库:

pip install -r requirements.txt

在这里插入图片描述

3. 模型文件转换

我们微调后的模型由两部分组成:基座模型和Lora适配器,需要对这两者分别转换,最后再合并。

3.1 基座模型转换

先用convert_hf_to_gguf.py工具转换基座模型:

注:convert_hf_to_gguf.py是llama.cpp提供的工具脚本,位于安装目录下,用于将huggingface上下载的safetensors模型格式转换为gguf文件。

!python /data2/downloads/llama.cpp/convert_hf_to_gguf.py \--outtype bf16 \--outfile /data2/anti_fraud/models/anti_fraud_v11/qwen2_bf16.gguf \--model-name qwen2 \/data2/anti_fraud/models/modelscope/hub/Qwen/Qwen2-1___5B-Instruct

参数释义:

  • outtype: 用于指定参数的输出精度,bf16表示16位半精度浮点数;
  • outfile: 指定输出的模型文件;
  • model-name: 模型名称;
INFO:hf-to-gguf:Loading model: Qwen2-1___5B-Instruct
INFO:gguf.gguf_writer:gguf: This GGUF file is for Little Endian only
INFO:hf-to-gguf:Exporting model...
INFO:hf-to-gguf:gguf: loading model part 'model.safetensors'
INFO:hf-to-gguf:token_embd.weight,         torch.bfloat16 --> BF16, shape = {1536, 151936}
INFO:hf-to-gguf:blk.0.attn_norm.weight,    torch.bfloat16 --> F32, shape = {1536}
INFO:hf-to-gguf:blk.0.ffn_down.weight,     torch.bfloat16 --> BF16, shape = {8960, 1536}
INFO:hf-to-gguf:blk.0.ffn_gate.weight,     torch.bfloat16 --> BF16, shape = {1536, 8960}
INFO:hf-to-gguf:blk.0.ffn_up.weight,       torch.bfloat16 --> BF16, shape = {1536, 8960}
INFO:hf-to-gguf:blk.0.ffn_norm.weight,     torch.bfloat16 --> F32, shape = {1536}
INFO:hf-to-gguf:blk.0.attn_k.bias,         torch.bfloat16 --> F32, shape = {256}
INFO:hf-to-gguf:blk.0.attn_k.weight,       torch.bfloat16 --> BF16, shape = {1536, 256}
INFO:hf-to-gguf:blk.0.attn_output.weight,  torch.bfloat16 --> BF16, shape = {1536, 1536}
INFO:hf-to-gguf:blk.0.attn_q.bias,         torch.bfloat16 --> F32, shape = {1536}
INFO:hf-to-gguf:blk.0.attn_q.weight,       torch.bfloat16 --> BF16, shape = {1536, 1536}
INFO:hf-to-gguf:blk.0.attn_v.bias,         torch.bfloat16 --> F32, shape = {256}
INFO:hf-to-gguf:blk.0.attn_v.weight,       torch.bfloat16 --> BF16, shape = {1536, 256}
……
INFO:hf-to-gguf:Set meta model
INFO:hf-to-gguf:Set model parameters
INFO:hf-to-gguf:gguf: context length = 32768
INFO:hf-to-gguf:gguf: embedding length = 1536
INFO:hf-to-gguf:gguf: feed forward length = 8960
INFO:hf-to-gguf:gguf: head count = 12
INFO:hf-to-gguf:gguf: key-value head count = 2
INFO:hf-to-gguf:gguf: rope theta = 1000000.0
INFO:hf-to-gguf:gguf: rms norm epsilon = 1e-06
INFO:hf-to-gguf:gguf: file type = 32
INFO:hf-to-gguf:Set model tokenizer
INFO:gguf.vocab:Adding 151387 merge(s).
INFO:gguf.vocab:Setting special token type eos to 151645
INFO:gguf.vocab:Setting special token type pad to 151643
INFO:gguf.vocab:Setting special token type bos to 151643
INFO:gguf.vocab:Setting chat_template to {% for message in messages %}{% if loop.first and messages[0]['role'] != 'system' %}{{ '<|im_start|>system
You are a helpful assistant.<|im_end|>
' }}{% endif %}{{'<|im_start|>' + message['role'] + '
' + message['content'] + '<|im_end|>' + '
'}}{% endfor %}{% if add_generation_prompt %}{{ '<|im_start|>assistant
' }}{% endif %}
INFO:hf-to-gguf:Set model quantization version
INFO:gguf.gguf_writer:Writing the following files:
INFO:gguf.gguf_writer:/data2/anti_fraud/models/anti_fraud_v11/qwen2_bf16.gguf: n_tensors = 338, total_size = 3.1G
Writing: 100%|██████████████████████████| 3.09G/3.09G [00:39<00:00, 77.9Mbyte/s]
INFO:hf-to-gguf:Model successfully exported to /data2/anti_fraud/models/anti_fraud_v11/qwen2_bf16.gguf

执行完后,就得到一个基座模型的gguf文件qwen2_bf16.gguf

3.2 lora适配器转换

接下来使用convert_lora_to_gguf.py 脚本工具来转换lora适配器。

!python /data2/downloads/llama.cpp/convert_lora_to_gguf.py \--base /data2/anti_fraud/models/modelscope/hub/Qwen/Qwen2-1___5B-Instruct \--outfile /data2/anti_fraud/models/anti_fraud_v11/lora_0913_4_bf16.gguf \/data2/anti_fraud/models/Qwen2-1___5B-Instruct_ft_0913_4/checkpoint-5454 \--outtype bf16 --verbose
  • base: 用于指定基座模型位置,目的是确保转换后的Lora适配器可以正确地与基座模型合并;
  • outfile: 用于指定适配器转换后的输出文件;
  • outtype: 指定转换格式,与基座模型相同,都用bf16;
  • checkpoint-5454是要转换的lora适配器的目录位置。
INFO:lora-to-gguf:Loading base model: Qwen2-1___5B-Instruct
INFO:gguf.gguf_writer:gguf: This GGUF file is for Little Endian only
INFO:lora-to-gguf:Exporting model...
INFO:hf-to-gguf:blk.0.ffn_down.weight.lora_a, torch.float32 --> BF16, shape = {8960, 16}
INFO:hf-to-gguf:blk.0.ffn_down.weight.lora_b, torch.float32 --> BF16, shape = {16, 1536}
INFO:hf-to-gguf:blk.0.ffn_gate.weight.lora_a, torch.float32 --> BF16, shape = {1536, 16}
INFO:hf-to-gguf:blk.0.ffn_gate.weight.lora_b, torch.float32 --> BF16, shape = {16, 8960}
INFO:hf-to-gguf:blk.0.ffn_up.weight.lora_a, torch.float32 --> BF16, shape = {1536, 16}
INFO:hf-to-gguf:blk.0.ffn_up.weight.lora_b, torch.float32 --> BF16, shape = {16, 8960}
……
INFO:gguf.gguf_writer:Writing the following files:
INFO:gguf.gguf_writer:/data2/anti_fraud/models/anti_fraud_v11/lora_0913_4_bf16.gguf: n_tensors = 392, total_size = 36.9M
Writing: 100%|██████████████████████████| 36.9M/36.9M [00:01<00:00, 21.4Mbyte/s]
INFO:lora-to-gguf:Model successfully exported to /data2/anti_fraud/models/anti_fraud_v11/lora_0913_4_bf16.gguf

执行完后,得到一个Lora适配器的gguf文件lora_0913_4_bf16.gguf

3.3 合并

使用llama-export-lora工具将基座模型和Lora适配器合并为一个gguf文件。

!/data2/downloads/llama.cpp/llama-export-lora \-m /data2/anti_fraud/models/anti_fraud_v11/qwen2_bf16.gguf \-o /data2/anti_fraud/models/anti_fraud_v11/model_bf16.gguf \--lora /data2/anti_fraud/models/anti_fraud_v11/lora_0913_4_bf16.gguf
  • -m: 指定基座模型的gguf文件。
  • --lora: 指定lora适配器的gguf文件。
  • -o: 指定合并后的模型文件。
file_input: loaded gguf from /data2/anti_fraud/models/anti_fraud_v11/qwen2_bf16.gguf
file_input: loaded gguf from /data2/anti_fraud/models/anti_fraud_v11/lora_0913_4_bf16.gguf
copy_tensor :  blk.0.attn_k.bias [256, 1, 1, 1]
merge_tensor : blk.0.attn_k.weight [1536, 256, 1, 1]
merge_tensor :   + dequantize base tensor from bf16 to F32
merge_tensor :   + merging from adapter[0] type=bf16
merge_tensor :     input_scale=1.000000 calculated_scale=2.000000 rank=16
merge_tensor :   + output type is f16
copy_tensor :  blk.0.attn_norm.weight [1536, 1, 1, 1]
merge_tensor : blk.0.attn_output.weight [1536, 1536, 1, 1]
……
copy_tensor :  output_norm.weight [1536, 1, 1, 1]
copy_tensor :  token_embd.weight [1536, 151936, 1, 1]
run_merge : merged 196 tensors with lora adapters
run_merge : wrote 338 tensors to output file
done, output file is /data2/anti_fraud/models/anti_fraud_v11/model_bf16.gguf

查看导出的文件:

-rw-rw-r-- 1   42885408 Nov  9 14:57 lora_0913_4_bf16.gguf
-rw-rw-r-- 1 3093666720 Nov  9 14:58 model_bf16.gguf
-rw-rw-r-- 1 3093666720 Nov  9 14:56 qwen2_bf16.gguf

经过上面三步,我们就将safetensors格式的基座模型和lora适配器导出为gguf格式的模型文件model_bf16.gguf,此时模型文件大小并没有变化,仍然有3G。

llama-cli命令验证此模型文件是否能正常work。

llama-cli是一种命令行接口,允许用户只通过一条命令完成模型启动和模型访问,用于快速测试和调试。

!/data2/downloads/llama.cpp/llama-cli --log-disable \-m /data2/anti_fraud/models/anti_fraud_v11/model_bf16.gguf \-p "我是一个来自太行山下小村庄家的孩子" \-n 100
我是一个来自太行山下小村庄家的孩子,我叫李丽丽。我是一个很平凡的女孩,我平凡得像一颗小草,平凡得像一滴水,平凡得像一粒沙。但我有一颗不平凡的心,我有我独特的个性,我有我灿烂的微笑。
  • -m: 指定要使用的模型文件路径;
  • -p:指定文本生成的起始提示;
  • -n: 指定要生成的文本序列的最大长度;
  • --log-disable: 关闭多余的日志输出,只输出最终的文本。

4. 量化

使用llama-quantize工具将模型文件由16位量化为8位。

!/data2/downloads/llama.cpp/llama-quantize \
/data2/anti_fraud/models/anti_fraud_v11/model_bf16.gguf /data2/anti_fraud/models/anti_fraud_v11/model_bf16_q8_0.gguf q8_0
  • model_bf16.gguf 是需要量化的模型文件;
  • model_bf16_q8_0.gguf 是量化后的模型文件;
  • q8_0 指定量化位宽为8位;
main: build = 3646 (cddae488)
main: built with cc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0 for x86_64-linux-gnu
main: quantizing '/data2/anti_fraud/models/anti_fraud_v11/model_bf16.gguf' to '/data2/anti_fraud/models/anti_fraud_v11/model_bf16_q8_0.gguf' as Q8_0……[ 337/ 338]                   output_norm.weight - [ 1536,     1,     1,     1], type =    f32, size =    0.006 MB
[ 338/ 338]                    token_embd.weight - [ 1536, 151936,     1,     1], type =   bf16, converting to q8_0 .. size =   445.12 MiB ->   236.47 MiB
llama_model_quantize_internal: model size  =  2944.68 MB
llama_model_quantize_internal: quant size  =  1564.62 MBmain: quantize time =  4671.71 ms
main:    total time =  4671.71 ms

经过量化后,模型文件由2944.68MB减小到1564.62MB,几乎缩小了一倍。

5. 运行

llama-server工具以http服务的方式来运行模型,可用于生产环境的部署。

`export CUDA_VISIBLE_DEVICES="" `
llama-server \-m /data2/anti_fraud/models/anti_fraud_v11/model_bf16_q8_0.gguf \-ngl 28 -fa \--host 0.0.0.0 --port 8080

- host/-port: 指定要监听的IP地址和端口,0.0.0.0表示监听所有网卡的IP地址。

注:如果只想在CPU上运行,可以将CUDA_VISIBLE_DEVICES环境变量置为空串。

在这里插入图片描述
在这里插入图片描述

6. 访问

llama.cpp提供了UI的方式来轻松访问,只要在浏览器里输入上面启动时所用的机器IP地址和服务监听的端口号即可访问。

http://xxx.xxx.xxx.xxx:8080

界面如下:
在这里插入图片描述
如上界面所示,它已经默认配置了一套推理参数,包括系统提示语prompt,多轮对话模板prompt_template、温度等,你可以轻松设置自己的参数。

对话示意如下:
在这里插入图片描述

除了UI方式以外,也支持通过http接口的形式访问。

%%time
!curl http://localhost:8080/v1/chat/completions \-H "Content-Type: application/json" \-d '{ \"messages": [{"role": "user", "content": "你是一个分析诈骗案例的专家,你的任务是分析下面对话内容是否存在经济诈骗(is_fraud:<bool>),如果存在经济诈骗,请找出正在进行诈骗行为的发言者姓名(fraud_speaker:<str>),并给出你的分析理由(reason:<str>),最后以json格式输出。\n\n张伟:您好,请问是林女士吗?我是中通快递客服,我姓张。您前几天网上买了一辆自行车对吧?很抱歉,我们的快递弄丢了,按规定我们会赔偿您360元。"}],\"max_tokens": 512,\"temperature": 0  \}' | jq

llama.cpp提供的http接口,在接口定义、请求参数、响应格式方面与OpenAI完全兼容,这可以很方便的和应用程序集成。

{"choices": [{"finish_reason": "stop","index": 0,"message": {"content": "{\"is_fraud\": true, \"fraud_speaker\": \"张伟\", \"reason\": \"对话中的张伟自称是中通快递客服,并提到用户的网购行为和物品丢失,要求赔偿。正常快递公司不会通过电话直接告知赔偿,而且金额较大,存在诱导用户提供个人信息或进行资金转账的嫌疑,符合常见的诈骗手法。\"}","role": "assistant"}}],"created": 1731148713,"model": "gpt-3.5-turbo-0613","object": "chat.completion","usage": {"completion_tokens": 75,"prompt_tokens": 118,"total_tokens": 193},"id": "chatcmpl-XEfFuF4pZt7h57DG0F7jhDbmG3ByAOlO"
}
CPU times: user 155 ms, sys: 10.5 ms, total: 165 ms
Wall time: 5.09 s

至此,我们成功的将微调后的模型在CPU上运行起来。

小结:本文从llama.cpp的安装开始,一步一步演示了如何将lora微调后的模型导出为gguf格式,并通过量化来减小模型的体积,并最终在cpu上跑起来的完整过程。gguf格式的模型只有单个文件,并且不依赖pytorch等复杂的环境,积大的简化了模型的运行的部署工作。

参考资料:

  • 欺诈文本分类检测(十七):支持分类原因训练
  • llama.cpp github项目
  • llama.cpp http server
  • gguf模型怎么玩
  • llama.cpp大模型量化简明手册

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/58787.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

硬件基础06 滤波器——无源、有源(含Filter Solutions、Filter Pro、MATLAB Fdatool)

目录 一、Filter Solutions 1、软件资源及安装教程如下 2、使用相关内容 二、Filter Pro使用 1、软件资源及安装教程如下 2、使用相关内容 三、MATLAB Fdatool 1、在matlab命令中输入fdatool 2、输入相关参数&#xff0c;例如低通、FIR、20阶、hamming窗 3、调用 &am…

【HGT】文献精讲:Heterogeneous Graph Transformer

【HGT】文献精讲&#xff1a;Heterogeneous Graph Transformer 标题&#xff1a; Heterogeneous Graph Transformer &#xff08;异构图Transformer&#xff09; 作者团队&#xff1a; 加利福尼亚大学Yizhou Sun 摘要&#xff1a; 近年来&#xff0c;图神经网络&#xff08;GN…

大厂基本功 | MySQL 三大日志 ( binlog、redo log 和 undo log ) 的作用?

前言 MySQL日志 主要包括错误日志、查询日志、慢查询日志、事务日志、二进制日志几大类。其中&#xff0c;比较重要的还要属二进制日志binlog&#xff08;归档日志&#xff09;和事务日志redo log&#xff08;重做日志&#xff09;和undo log&#xff08;回滚日志&#xff09;…

【系统架构设计师(第2版)】五、软件工程基础知识

5.1 软件工程 20世纪60年代&#xff0c;为了解决软件危机&#xff0c;提出了软件工程的概念。 软件危机的具体表现&#xff1a; 软件开发进度难以预测&#xff1b;软件开发成本难以控制&#xff1b;软件功能难以满足用户期望&#xff1b;软件质量无法保证&#xff1b;软件难以…

手机内卷下一站,AI Agent

作者 | 辰纹 来源 | 洞见新研社 2024年除夕夜&#xff0c;OPPO在央视春晚即将开始前举办了一场“史上最短发布会”&#xff0c;OPPO首席产品官刘作虎宣布&#xff0c;“OPPO正式进入AI手机时代”。 春节假期刚过&#xff0c;魅族又公开表示&#xff0c;将停止“传统智能手机…

科研绘图系列:R语言组合堆积图(stacked plot)

文章目录 介绍加载R包数据数据预处理画图1画图2组合图形系统信息介绍 堆积图(Stacked Chart),也称为堆叠图,是一种常用的数据可视化图表,主要用于展示不同类别的数据量在总体中的分布情况。堆积图可以是柱状图、条形图或面积图的形式,其中各个类别的数据量被叠加在一起,…

Node.js 完全教程:从入门到精通

Node.js 完全教程&#xff1a;从入门到精通 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境&#xff0c;允许开发者在服务器端使用 JavaScript。它的非阻塞 I/O 和事件驱动架构使得 Node.js 非常适合于构建高性能的网络应用。本文将详细介绍 Node.js 的安装、基本语…

微服务day03

导入黑马商城项目 创建Mysql服务 由于已有相关项目则要关闭DockerComponent中的已开启的项目 [rootserver02 ~]# docker compose down WARN[0000] /root/docker-compose.yml: version is obsolete [] Running 4/4✔ Container nginx Removed …

每日一题之二叉树

已知结点元素值为正整数且值不相同的一棵二叉树。 该二叉树通过给出其先序遍历序列和中序遍历序列构造而成。 输入一个整数x&#xff0c;针对此二叉树编写程序求出x的右子树中所有结点值的和&#xff08;若x不在树上&#xff0c;输出-1&#xff09;。 输入说明&#xff1a;第一…

win10系统使用Visual Studio 2019或cmake编译SDL2为32位库时出现error C2118: 负下标winnt.h的解决方法

提示&#xff1a; 下图蓝体字中的VS2008是错误的&#xff0c;其实SDL.sln是用VS2010版本的软件开发的&#xff08;对于SDL-release-2.0.5.zip源码而言至少是这样&#xff0c;而2024-11-6为止SDL是2.30.9版本了&#xff0c;2.30.9版本则无需自己编译&#xff0c;只需下载带后缀…

推荐一款管道数据检索工具:Pipedata-Pro

Pipedata-Pro是一款专为设计石油、天然气、水和蒸汽管道及管道系统的工程师开发的应用程序。该应用程序提供了设计管道系统所需的工程数据&#xff0c;拥有一个全面的管道类型、配件和材料数据库。 软件特点&#xff1a; 1. 技术参数查询&#xff1a;Pipedata-Pro 提供关于管道…

算法竞赛(Python)-数组

文章目录 一 、排序算法二 、二分查找1 二分查找讲解2 二分查找题目&#xff08;1&#xff09;二分查找&#xff08;2&#xff09;在排序数组中查找元素的第一个和最后一个位置&#xff08;3&#xff09;两数之和 II - 输入有序数组 三、数组双指针1对撞指针对撞指针题目1&…

基于STM32的LCD1602显示Proteus仿真设计(仿真+程序+设计报告+讲解视频)

这里写目录标题 1.主要功能0. 资料清单&下载链接资料下载链接&#xff1a;2.仿真设计3. 程序设计4. 设计报告5. 框图 基于STM32的LCD1602显示Proteus仿真设计(仿真程序设计报告讲解视频&#xff09; 仿真图proteus 8.9 程序编译器&#xff1a;keil 5 编程语言&#xff1a…

SpringBoot项目编译报错 类文件具有错误的版本 61.0, 应为 52.0

springboot项目在编译时报错&#xff1a; /Users/Apple/Developer/art/caicai/cai-api/dubbo-samples/1-basic/dubbo-samples-spring-boot/dubbo-samples-spring-boot-provider/src/main/java/org/apache/dubbo/springboot/demo/provider/ProviderApplication.java:22:32 java…

PVE纵览-备份与快照指南

PVE纵览-备份与快照指南 文章目录 PVE纵览-备份与快照指南摘要1 备份与快照概述定义与区别备份与快照在PVE中的应用场景 2 PVE 备份功能详解备份类型与策略配置备份任务自动化备份管理 3 PVE 快照功能详解快照的工作原理快照的创建与恢复机制快照对系统性能的影响快照的使用场景…

Mac如何实现最简单的随时监测实时运行状态的方法

Mac book有着不同于Windows的设计逻辑与交互设计&#xff0c;使得Mac book有着非常棒的使用体验&#xff0c;但是在Mac电脑的使用时间过长时&#xff0c;电脑也会出现响应速度变慢或应用程序崩溃的情况&#xff0c;当发生的时候却不知道什么原因导致的&#xff0c;想要查询电脑…

JavaWeb合集23-文件上传

二十三 、 文件上传 实现效果&#xff1a;用户点击上传按钮、选择上传的头像&#xff0c;确定自动上传&#xff0c;将上传的文件保存到指定的目录中&#xff0c;并重新命名&#xff0c;生成访问链接&#xff0c;返回给前端进行回显。 1、前端实现 vue3AntDesignVue实现 <tem…

WPF之iconfont(字体图标)使用

1&#xff0c;前文&#xff1a; WPF的Xaml是与前端的Html有着高度相似性的标记语言&#xff0c;所以Xaml也可同Html一般轻松使用阿里提供的海量字体图标&#xff0c;从而有效的减少开发工作度。 2&#xff0c;下载字体图标&#xff1a; 登录阿里图标库网iconfont-阿里巴巴矢量…

leetcode92:反转链表||

给你单链表的头指针 head 和两个整数 left 和 right &#xff0c;其中 left < right 。请你反转从位置 left 到位置 right 的链表节点&#xff0c;返回 反转后的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], left 2, right 4 输出&#xff1a;[1,4,3,2…

Python-安装与PyCharm的安装配置(1)

目录 安装 打开运行 PyCharm的安装 新建项目 安装 找到官网下载对应的电脑对应的版本 Welcome to Python.org -- 官网 下载稳定版的 安装记得勾选配置环境&#xff0c;这样自己就不需要再配置环境了 安装成功 至此python的运行环境就安装好了 打开运行 在开始菜单中可以…