销售网站的技巧,镇江网友之家手机版,有关网站开发的书籍,建设网站花都文章目录 背景介绍第三方大模型API 介绍LLamafactory 部署API大模型 API 调用工具类项目开源 背景介绍
第三方大模型API
目前#xff0c;市面上有许多第三方大模型 API 服务提供商#xff0c;通过 API 接口向用户提供多样化的服务。这些平台不仅能提供更多类别和类型的模型… 文章目录 背景介绍第三方大模型API 介绍LLamafactory 部署API大模型 API 调用工具类项目开源 背景介绍
第三方大模型API
目前市面上有许多第三方大模型 API 服务提供商通过 API 接口向用户提供多样化的服务。这些平台不仅能提供更多类别和类型的模型选择还因其用户规模较大能够以更低的成本从原厂获得服务再将其转售给用户。此外这些服务商还支持一些海外 API 服务例如 ChatGPT 等为用户提供了更加广泛的选择。
https://www.gptapi.us/register?aff9xEy
比如上述网站以 API 接口的形式对外提供的服务比官方的 API 要便宜。
装包
pip install langchain langchain_openai运行下述代码完成上述网站的注册后并填上述网站的 api_key 便可通过 python API 调用就会收到 gpt-4o-mini 大模型的响应。
from langchain_openai import ChatOpenAIllm ChatOpenAI(modelgpt-4o-mini, base_urlhttps://www.gptapi.us/v1/,api_keysk-xxx, # 在这里填入你的密钥)
res llm.invoke(你是谁请你简要做一下自我介绍)
print(res)介绍
在部署垂直领域模型时我们通常会对开源大模型进行微调并获得相应的 LoRA 权重。在接下来的部分我将介绍如何使用 LLamafactory 将微调后的 LoRA 模型部署为 API 服务。
在 Python 中调用 API 服务时如果采用同步方式进行请求往往会导致请求速度较慢。因为同步方式需要在接收到上一条请求的响应后才能发起下一条请求。
为了解决这一问题我将为大家介绍如何通过异步请求的方式在短时间内发送大量请求从而提升 API 调用效率。
LLamafactory 部署API
关于 LLamafactory 的下载与微调模型点击查看我的这篇博客Qwen2.5-7B-Instruct 模型微调与vllm部署详细流程实战.https://blog.csdn.net/sjxgghg/article/details/144016723
vllm_api.yaml 的文件内容如下
model_name_or_path: qwen/Qwen2.5-7B-Instruct
adapter_name_or_path: ../saves/qwen2.5-7B/ner_epoch5/
template: qwen
finetuning_type: lora
infer_backend: vllm
vllm_enforce_eager: true# llamafactory-cli chat lora_vllm.yaml
# llamafactory-cli webchat lora_vllm.yaml
# API_PORT8000 llamafactory-cli api lora_vllm.yaml使用下述命令便可把大模型以 API 部署的方式部署到8000端口
API_PORT8000 llamafactory-cli api vllm_api.yamlLangChain 的 invoke 方法是常用的调用方式但该方法并不支持异步操作。如果读者想了解同步与异步在速度上的差距可以自行尝试使用一个 for 循环调用 invoke 方法并对比其性能表现。
import os
from langchain_openai import ChatOpenAI
client ChatOpenAI(modelgpt-3.5-turbo, api_key{}.format(os.environ.get(API_KEY, 0)),base_urlhttp://localhost:{}/v1.format(os.environ.get(API_PORT, 8000)),
)res llm.invoke(你是谁请你简要做一下自我介绍)
print(res)在项目文件夹下新建一个 .env 文件 其中 API_KEY 的值便是API接口调用的 API_KEY。
API_KEYsk-12345678LLamafactory 通过API部署的大模型地址是: http://localhost:8000/v1 API_KEY 是.env 文件中 API_KEYsk-12345678
大模型 API 调用工具类
使用异步协程加快 API 的调用速度可以参考我们前面的这篇文章大模型 API 异步调用优化高效并发与令牌池设计实践.https://blog.csdn.net/sjxgghg/article/details/143858730
我们在前面一篇文章的基础上对异步类再封装了一下。
装包
pip install langchain tqdm aiolimiter python-dotenvimport os
import random
import asyncio
import pandas as pd
from tqdm import tqdm
from typing import List
from dataclasses import dataclass, field
from aiolimiter import AsyncLimiter
from langchain_openai import ChatOpenAI
from dotenv import load_dotenvload_dotenv()def generate_arithmetic_expression(num: int):生成数学计算的公式和结果# 定义操作符和数字范围除法operators [, -, *]expression (f{random.randint(1, 100)} {random.choice(operators)} {random.randint(1, 100)})num - 1for _ in range(num):expression f{expression} {random.choice(operators)} {random.randint(1, 100)}result eval(expression)expression expression.replace(*, x)return expression, resultdataclass
class AsyncLLMAPI:大模型API的调用类base_url: strapi_key: str # 每个API的key不一样uid: int 0cnt: int 0 # 统计每个API被调用了多少次model: str gpt-3.5-turbollm: ChatOpenAI field(initFalse) # 自动创建的对象不需要用户传入num_per_second: int 6 # 限速每秒调用6次def __post_init__(self):# 初始化 llm 对象self.llm self.create_llm()# 创建限速器每秒最多发出 5 个请求self.limiter AsyncLimiter(self.num_per_second, 1)def create_llm(self):# 创建 llm 对象return ChatOpenAI(modelself.model,base_urlself.base_url,api_keyself.api_key,)async def __call__(self, text):# 异步协程 限速self.cnt 1async with self.limiter:return await self.llm.agenerate([text])staticmethodasync def _run_task_with_progress(task, pbar):包装任务以更新进度条result await taskpbar.update(1)return resultstaticmethoddef async_run(llms: List[AsyncLLMAPI],data: List[str],keyword: str , # 文件导出名output_dir: str output,chunk_size500,):async def _func(llms, data):异步请求处理一小块数据results [llms[i % len(llms)](text) for i, text in enumerate(data)]with tqdm(totallen(results)) as pbar:results await asyncio.gather(*[AsyncLLMAPI._run_task_with_progress(task, pbar)for task in results])return resultsidx 0all_df []while idx len(data):file f{idx}_{keyword}.csvfile_dir os.path.join(output_dir, file)if os.path.exists(file_dir):print(f{file_dir} already exist! Just skip.)tmp_df pd.read_csv(file_dir)else:tmp_data data[idx : idx chunk_size]loop asyncio.get_event_loop()tmp_result loop.run_until_complete(_func(llmsllms, datatmp_data))tmp_result [item.generations[0][0].text for item in tmp_result]tmp_df pd.DataFrame({infer: tmp_result})# 如果文件夹不存在则创建if not os.path.exists(tmp_folder : os.path.dirname(file_dir)):os.makedirs(tmp_folder)tmp_df.to_csv(file_dir, indexFalse)all_df.append(tmp_df)idx chunk_sizeall_df pd.concat(all_df)all_df.to_csv(os.path.join(output_dir, fall_{keyword}.csv), indexFalse)return all_dfif __name__ __main__:# 生成 数学计算数据集texts []labels []for _ in range(1000):text, label generate_arithmetic_expression(2)texts.append(text)labels.append(label)llm AsyncLLMAPI(base_urlhttp://localhost:{}/v1.format(os.environ.get(API_PORT, 8000)),api_key{}.format(os.environ.get(API_KEY, 0)),)AsyncLLMAPI.async_run([llm], texts, keyword数学计算, output_diroutput, chunk_size500)
使用异步类在短时间内向对方服务器发送大量的请求可能会导致服务器拒绝响应。 由于使用了异步的请求则必须在所有的请求都完成后才能拿到结果。为了避免程序中途崩溃导致前面的请求的数据丢失故 使用 chunk_size 对请求的数据进行切分每完成一块数据的请求则把该块数据保存到csv文件中。
本文使用 generate_arithmetic_expression 生成1000条数学计算式调用大模型 API 完成计算。
运行效果如下
原始的 1000 条数据设置chunk_size为500故拆分为2块500条分批进行处理。
为了避免程序崩垮分批进行异步推理若程序崩溃了可重新运行程序会从上一次崩溃的点重新运行。要保证数据集输入的一致
最终的输出文件是 all_数学计算.csv 它是所有分快csv文件的汇总。
项目开源
https://github.com/JieShenAI/csdn/tree/main/24/11/async_llm_api vllm_api.yaml 是 llamafactory 的API部署的配置core.py 是主要代码