使用 Phi-2 在 Python 中生成语言

设置和安装

使用安装说明安装 ONNX Runtime generate() API Python 包。

构建 phi-2 ONNX 模型

onnxruntime-genai 包包含一个模型构建器,它使用 Huggingface 上的权重和配置生成 phi-2 ONNX 模型。该工具还允许您从 Hugging Face 下载权重、加载本地存储的权重或从 GGUF 格式转换。有关更多详细信息,请参阅如何构建模型

如果使用此处显示的 -m 选项,您将需要登录 Hugging Face。

pip install huggingface-hub
huggingface-cli login

您可以以不同的精度构建模型。此命令使用 int4,因为它生成最小的模型并且可以在 CPU 上运行。

python -m onnxruntime_genai.models.builder -m microsoft/phi-2 -e cpu -p int4 -o ./example-models/phi2-int4-cpu

您可以将使用 -o 选项指定的输出文件夹的名称替换为您选择的文件夹。

运行脚本后,您将在此文件夹中看到生成的一系列文件。它们包括供您参考的 HuggingFace 配置,以及 ONNX Runtime generate() API 使用的以下生成文件。

  • model.onnx:phi-2 ONNX 模型
  • model.onnx.data:phi-2 ONNX 模型权重
  • genai_config.json:ONNX Runtime generate() API 使用的配置

您可以查看和更改 genai_config.json 文件中的值。除非您自带了模型并且它具有不同的参数,否则不应更新模型部分。

搜索参数可以更改。例如,您可能希望使用不同的温度值生成。这些值也可以通过下面显示的 set_search_options 方法设置。

使用示例提示运行模型

使用以下 Python 脚本运行模型。您可以根据需要更改提示和其他参数。

import onnxruntime_genai as og

prompt = '''def print_prime(n):
    """
    Print all primes between 1 and n
    """'''

model=og.Model(f'example-models/phi2-int4-cpu')

tokenizer = og.Tokenizer(model)

tokens = tokenizer.encode(prompt)

params=og.GeneratorParams(model)
params.set_search_options({"max_length":200})
params.input_ids = tokens

output_tokens=model.generate(params)[0]

text = tokenizer.decode(output_tokens)

print(text)

运行批量提示

您还可以通过模型运行批量提示。

prompts = [
    "This is a test.",
    "Rats are awesome pets!",
    "The quick brown fox jumps over the lazy dog.",
    ]

inputs = tokenizer.encode_batch(prompts)

params=og.GeneratorParams(model)
params.input_ids = tokens

outputs = model.generate(params)[0]

text = tokenizer.decode(output_tokens)

流式传输 tokenizer 的输出

如果您正在开发一个需要一次一个地将令牌输出到用户界面的应用程序,则可以使用流式 tokenizer。

generator=og.Generator(model, params)
tokenizer_stream=tokenizer.create_stream()

print(prompt, end='', flush=True)

while not generator.is_done():
    generator.compute_logits()
    generator.generate_next_token_top_p(0.7, 0.6)
    print(tokenizer_stream.decode(generator.get_next_tokens()[0]), end='', flush=True)