11012 views
[toc] # HepAI平台入门实践教程 入门实践将学习如何获取HepAI平台的API-KEY并访问平台的模型,进行下列练习:调用平台的GPT-3.5(ChatGPT)进行提示工程完成天体物理文本数据信息提取、调用平台的SAM大模型进行不限类别的图像分割、手搓Transformer等。 ### 1 准备工作 #### 1.1 [访问HepAI平台获取API-KEY](https://note.ihep.ac.cn/s/_z4fHQp7f) API秘钥允许用户通过Python或Java程序直接调用HepAI平台的模型,而无需考虑算法部署、算力资源等问题。 *获取API-KEY步骤如下:* + (1) 打开HepAI平台[https://ai.ihep.ac.cn](https://ai.ihep.ac.cn),点击右上角`请登录`,如已有高能所统一认证账号,选择统一认证登录,或注册本地用户后登录。
+ (2) 登录后点击右上角`我的`,在左侧点击`API-KEYS`,点击`创建API-KEY`-`确认提交`。创建成功后,点击`复制`,API-KEY会被复制到剪贴板。
注意:为了保护您帐户的安全,请不要与他人共享您的API密钥,也不要在浏览器或其他客户端代码中公开。 + (3) 设置环境变量: 在终端中输入: ```bash vi ~/.bashrc # 将下一行内容添加到文件末尾并保存: export HEPAI_API_KEY= source ~/.bashrc # 刷新环境变量 echo $HEPAI_API_KEY # 检查环境变量是否生效 ``` + (4) 每个账号可通过[门户网站](https://ai.ihep.ac.cn)-`我的`-`我的模型`查看API-KEY可调用的模型,例如: ```bash { "id": "000001", "model_name": "openai/gpt-3.5-turbo", "speed": 1, "queue_length": 0, "permissions": { "groups": [ "gpt-3.5" ], "users": [ "hai_next_app" ], "owner": [ "zdzhang@ihep.ac.cn" ] }, "misc": null } ``` 上述信息表明可调用模型名为`openai/gpt-3.5-turbo`。未授权的模型不会显示,无法调用。 + (5) 如学习过程中遇到问题,可访问HepAI平台的ChatGPT提问原因和解决方案,访问[https://ai.ihep.ac.cn](https://ai.ihep.ac.cn)-点击`开始聊天`,聊天帮助[见此处](https://note.ihep.ac.cn/s/1xfkYA01t)。 #### 1.2 安装Conda和Python环境 + (1) 在高能所Slurm计算集群中,终端输入`cp /home/lhaaso/sch/sch001/hepai_env.sh ~`将拷贝启动环境变量的脚本的本地,输入`source ~/hepai_env.sh`激活已存在的Conda和Python环境。 + (2) 终端输入`echo $HEPAI_API_KEY`查看已存在的API-KEY。 + (3) 终端输入`python -V`查看python版本,输入`pip list`查看已安装的python库。 + (4) 终端输入`pip install hepai --upgrade`安装和更新hepai库。 + (5) 如需自行安装参见[如何安装Conda和Python环境](https://note.ihep.ac.cn/s/Wr541RKE0)。 #### 1.3 下载教程仓库hepai-tutorials + (1) 查看和安装git。打开终端输入`git --version`查看是否有git, 如无需先安装:[git官网下载](https://git-scm.com/download/win), ubuntu可使用`sudo apt-get install git`安装。 + (2) 教程仓库地址为[https://code.ihep.ac.cn/hepai/hepai-tutorials](https://code.ihep.ac.cn/hepai/hepai-tutorials),使用命令`git clone https://code.ihep.ac.cn/hepai/hepai-tutorials.git`克隆仓库。 + (3) `cd hepai-tutorials`进入文件夹, `cd basic`进入文件夹,`vi list_models.py`查看代码内容,代码如下: ```python= import os import hepai as hai hai.api_key = os.getenv('HEPAI_API_KEY') models = hai.Model.list() # 列出所有可用模型 print(models) ``` + (4) 终端输入`python list_models.py`列出获得授权的模型。 **报错处理** + 报错1: ``` ValueError: The HepAI API-KEY is required. You can set it via `hai.api_key=xxx` in your code, or set the environment variable `HEPAI_API_KEY` via `export HEPAI_API_KEY=xxx`. Alternatively, it can be provided by passing in the `api_key` parameter when calling the method. ``` 报错原因:HEPAI_API_KEY未正确配置。 解决方法:查看5.1.1-3节配置。 ### 2 通过API-KEY调用ChatGPT模型初探 以ChatGPT为例,设置系统提示词,输入问题(即提示,必要时需做提示工程),它会流式地输出回答。如果一个会话有多轮问答,需要将历史问题一并通过`messages`变量传入。 `gpt-35.py`中包含基本调用方法,代码如下: ```python-repl= import os, sys import hai hai.api_key = os.getenv('HEPAI_API_KEY') def request_chatgpt(prompt='hello'): system_prompt = "You are ChatGPT, answering questions conversationally" result = hai.LLM.chat( model='openai/gpt-3.5-turbo', messages=[ {"role": "system", "content": system_prompt}, {"role": "user", "content": prompt}, ## 如果有多轮对话,可以继续添加,"role": "assistant", "content": "Hello there! How may I assist you today?" ## 如果有多轮对话,可以继续添加,"role": "user", "content": "I want to buy a car." ], stream=True, ) full_result = "" for i in result: full_result += i sys.stdout.write(i) sys.stdout.flush() print() return full_result question = "hello" print(f"USER : {question}") print(f"ChatGPT: ", end="") answer = request_chatgpt(prompt=question) ``` 核心概念: + api_key: 通过HepAI平台获取的API-KEY + model: 模型名如`openai/gpt-3.5-turbo`,通过`list_models`查看获得授权的模型名 + system_prompt: 系统提示,对ChatGPT对话生成机器人进行的系统设置。 + prompt: 当前问题(即最后一个问题) + 轮次:一个对话可能有多个轮次(多对问答),在输入最后一个问题时,需要在`messages`中将所有历史问答均传入模型,如果不传入则视为每次提问都是一个新的对话。`messages`中共有3种角色的信息:`system`代表系统消息,`user`代表用户的问题,`assistant`代表ChatGPT的答案。 终端输入`python gpt_35.py`执行调用,输出类似如下:
+ 报错处理: ![](https://note.ihep.ac.cn/uploads/fa6e089c-4f8e-43b3-97fc-042de6e908cd.png) + 错误原因:服务端没有启动所请求的模型,或提供的API-KEY没有方位该模型的权限。 + 解决方法:先运行list_model.py查看可用模型,再请求。或申请所需模型的权限。 通过API-KEY使用HepAI平台的AI模型的详细文档[参见此处](https://note.ihep.ac.cn/Ob9b1ZicRCWsnv1msqFhcA?both)。 ### 3 使用ChatGPT进行天体物理文本数据信息提取 本节展示如何进行提示工程,对天体物理文本信息进行准确提取。 + (1) 见5.1.2,配置好Python环境,设置好API-KEY后。 + (2) 终端输入`cd astro`,天体Gamma爆文本数据见`data`文件夹的`000001.txt`和`000002.txt` + (3) `python astro.py`运行从非结构化的天体文本信息里提取数据。 如何请求ChatGPT已经在上节展示,本节的核心是如何进行提示工程让ChatGPT的输出更加准确。 由于ChatGPT等大模型拥有**上下文学习和思维链**等能力,因此,可以通过提示工程在不改变模型参数的情况下让模型有更好的输出。 #### 提示工程的要点 + (1) 尽量清晰的描述情景,例如:“如何实现xx功能”→“在python中如何实现xx功能”; + (2) 给出几个示例; + (3) 可以提示模型输出风格,例如:“简要输出”、“尽量解释细节”、“用卖萌的语气回答”; + (4) 指定输出格式,例如:“输出为json格式”,并给定格式示例; + (5) 由于训练预料的问题,使用英文的效果会比中文略好。 针对GRB信息提取的提示工程包含设计系统提示和上下文提示。 ```python= def extract(self, input): system_prompt = "You are an information extractor, and I will give you a paragraph of text. Please extract the information as required and output it in the provided format." # example = f"source name: Fermi GBM source type: Gamma-ray Burst Monitor RA: 280.7 Dec: -10.8 Error R: 5.2 degrees Observation time: 22:01:39 UT on 4 Mar 2023 Instrument name: Fermi Gamma-ray Burst Monitor (GBM)" example = "{'Source_name': , 'Source_type': , 'RA': , 'Dec': , 'Error_R': , 'Observation_time': , 'Instrument_name': }" prompt = f""" Please extract the following information from the text delimited by triple backticks: Source name, Source type, RA, Dec, Error R, Observation time and Instrument name. Provide them in JSON format, for example {example}. Only output one JSON object. TEXT: ```{input}``` """ ``` + 提示工程解析: 第2行代码中系统提示描述了指定LLM为信息提取器,并指示将提供文本,让LLM根据要求提取信息并按照指定格式输出。 第5行代码给出一个输出示例 第6到13行指示LLM从由三个反单引号\`包围的文本中提取信息,需要提取的信息包括Source name, Source type, RA, Dec, Error R, Observation time和Instrument name. 并指示LLL输出为JSON格式,将第5行的示例嵌入,指示仅输出Json对象。 ### 4 使用SAM大模型进行图像分割 本节展示使用SAM大模型对任意图像进行任意类别的目标分割。 + (1) 见5.1.2,配置好Python环境,设置好API-KEY后。 + (2) 终端输入`cd sam`,示例分割数据见`data`文件夹内。 + (3) 终端输入如下指令进行图像分割: ```python-repl= python seg_via_sam.py --img ./data/000056.png --plot # 可选参数: --img # 指定需要处理的图像路径 --plot # 是否绘制并显示分割效果图 --save # 是否将效果图保存到xxxxx_masked.png中 ``` 分割结果保存在于图像位置相同的目录新建`000056文件夹`内,输出如下: + outputs.json: 列表,每个元素代表一个分割出的目标,每个元素的键有:area: 像素面积;bbox: 目标的最小外接矩形框等;segmentation_path: 指定的目标掩码所在的位置。 + masks文件夹:outputs_0.npz等,每个npz是一个目标的掩码,一张图内目标数目不定,可以使用numpy读出,读出后为与原图等高宽的二值掩码(h, w),值为1代表目标,值为0代表背景。 + 000056_masked.png: 将所有掩码按照一定透明度绘制到原图上的分割效果图。 **SAM大模型是提示分割型任务,因此给定不同的提示,能分割出不同的目标。** 提示的要点如下: + (1) 提示可以是点提示、框提示和全景分割提示; + (2) 给定点提示,分割目标,例如:input_points=[[300,200]],input_labels=[1]; + (3) 给定框提示,分割目标,例如:input_boxes=[[180,180,200,200]]; + (4) 给定全景分割提示,分割目标。未给定点提示和框提示时默认采用。 ```python= def seg_via_sam(self, img, input_points=None, input_labels=None, input_boxes=None, only_mask=False, ): mask_list = hai.Model.inference( model='meta/segment_anything_model', # 指定可用模型名字 api_key=os.getenv("HEPAI_API_KEY"), # 输入hepai_api_key img = img, # 输入图片路径或cv2读取的图片 input_points = input_points, # 点提示,格式为[[x1,y1],[x2,y2],...] input_labels = input_labels, # 点提示对应的标签,0代表背景点,1代表前景点,格式为[0, 1, ...], 需要与input_points一一对应,如不提供默认全为前景点 input_boxes = input_boxes, # 框提示格式为[[x1,y1,x2,y2],[x1,y1,x2,y2],...] only_mask = only_mask, # 是否只输出mask stream=False, # 是否流式输出 timeout=60, # 网络请求超时时间,单位秒 ) return mask_list ``` 代码释义: + 第10行,模型名字`meta/segment_anything_model` + 第12行,需要分割的图片,可以是图片路径或已用cv2读取的图片 + 第13行,点提示,格式为[[x1,y1],[x2,y2]] + 第14行,点提示对应标签,0代表背景点(不感兴趣),1代表前景点(感兴趣),如[1,0] + 第15行,框提示,格式为[[x1,y1,x2,y2],[x1,y1,x2,y2]] **进阶**:可尝试实现**交互式提示分割小应用**,绘制原始图像的同时,捕获鼠标的左键点击、右键点击、绘制矩形的操作,分别对应前景点提示、背景点提示和矩形框提示,请求SAM模型并将分割结果绘制到图像上(即PS中新的抠图功能)。 ### 5 手动编写和从头训练一个Transformer Transformer是继CNN、RNN、GNN后一种新的神经网络架构,目前最强的许多AI模型(例如:AlphaFold2, ChatGPT、SAM等)都基于Transformer构建。 教程提供一个transformer示例,代码内包括自注意力机制怎么实现、怎么在文本序列上训练等。 + `cd hepai-tutorails/nn/transformer` + 输入`./srun.sh 8 1` 申请8cpu核1gpu卡的交互式计算资源,注意: srun.sh中需要正确配置partition, qos等信息,账号应具有访问相应资源的权限。终端输入`nvidia-smi`查看申请到的GPU资源。 + 在计算节点`python transformer.py`。注意:若在登录节点,需要使用脚本提交任务到计算节点而不是直接在登录节点训练: `sbatch submit-job.sh`。 结果如下:
### 6 延伸学习代码仓库 + [HepAI-SAM部署代码](https://code.ihep.ac.cn/hepai/hepai-sam) + [使用PointNet对JUNO实验的大气中微子进行重建和鉴别](https://code.ihep.ac.cn/zhangyiyu/pointnet) + [Particle Transformer for Jet Tagging](https://github.com/jet-universe/particle_transformer) + [ParticleNet: Jet Tagging via Particle Clouds](https://github.com/hqucms/ParticleNet)
Baidu
map