趁着ChatGPT官方API release的热度没消散,分享一下个人(穷逼)自用的快速迭代黑盒LLM工具包。
gpt-3.5-turbo
系列继续使用,它们也是驱动ChatGPT的后端。对此,openai-manager更新了对应的ChatCompletions
接口。如果你有批量的免费体验账号,在openai-manager
使用gpt-3.5-turbo
系列API能避免触发免费账号的RateLimit限制,线性提高实验的吞吐量。
api.openai.com
在内地全面被墙,内地用户请使用export OPENAI_API_PROXY
设置可用代理以继续使用openai-manager。此外,自ChatCompletion API开放之后,CDEX API的生成速率也下降明显,且用且珍惜。
Background
在OpenAI所有开放的language completion API中,code-davinci
系列是唯一可在Beta阶段免费使用的。但OpenAI在CODEX系列API上施加了很严格的频率限制,官方描述为20 requests/min和40000 tokens/min,以先到者为准。显然,这种限制严重拖慢了在大规模数据集上的验证!因此我用协程实现了一个带Rate Limit Control的生产者-消费者队列加速批量化提交OpenAI Request,支持多API_key并行。现在就去找伙伴们收集ChatGPT玩剩下的账号,狠狠加速你的黑盒LLM实验吧!
用法
openai-manager Github上提供了完整流程,一个快速开始的案例如下:
pip install -U openai-manager
用环境变量或从YAML配置文件导入多个API_Key:
OPENAI_API_KEY_1=sk-Nxo****** OPENAI_API_KEY_2=sk-TG2****** OPENAI_API_KEY_3=sk-Kpt****** # You can set a global proxy for all api_keys OPENAI_API_PROXY=http://127.0.0.1:7890 # You can also append proxy to each api_key. # Make sure the indices match. OPENAI_API_PROXY_1=http://127.0.0.1:7890 OPENAI_API_PROXY_2=http://127.0.0.1:7890 OPENAI_API_PROXY_3=http://127.0.0.1:7890
开始提交!建议每次不超过1024个prompt:
import openai_manager prompt = "Once upon a time, " prompts = [prompt] * 10 responses = openai_manager.Completion.create( model="code-davinci-002", prompt=prompts, max_tokens=20, ) # 注意,当前实现下responses和openai-python不同,responses是一个List[dict]; # 但是responses保证回复按提交的prompt顺序,而openai-python的官方实现需要按索引匹配。
效果
prompts较多的情况下可以近似实现API_key个数的线性加速,不希望看到进度条的话可以加上no_tqdm=True
。
默认的logging level为WARNING,此等级下会显示每次RateLimitExceeded的结果,如果初步测试发现RateLimit次数不超过总提交次数的10%,你可以用export OPENAI_LOG_LEVEL=40
忽略这些警告。
后续
考虑到openai-python是可以改请求URL的,如果考虑最小的原始代码改动,将openai-manager做成一个serving服务是一个不错的选择。例如运行python -m openai.serving --port 8888 --bind 127.0.0.1
,然后将openai-python的URL指向http://127.0.0.1:8888
。Anyway,这应该是闲下来之后下一步可以做的事。
从2023年04月01日起,我们支持了openai_manager.serving
,具体使用方法如下:
Use it as a proxy server between you and OpenAI endpoint. First, run python -m openai_manager.serving --port 8000 --host localhost --api_key [your custom key]
. Then set up the official python openai package (or any other official API implementations):
import openai
openai.api_base = "http://localhost:8000/v1"
openai.api_key = "[your custom key]"
# run like normal
prompt = ["Once upon a time, "] * 10
response = openai.Completion.create(
model="text-davinci-003",
prompt=prompt,
max_tokens=20,
)
print(response["choices"][0]["text"])