跳到内容

离线批量生成

离线批量生成distilabel 中实现的某些 LLM 提供的一项功能,允许将输入发送到 LLM 即服务平台,并以异步方式等待输出。LLM 即服务平台提供此功能,因为它允许他们收集大量输入并创建尽可能大的批次,从而最大限度地提高硬件利用率并降低服务成本。作为交换,用户必须等待一定时间才能准备好输出,但每个 token 的成本通常要低得多。

distilabel pipelines 能够通过以下方式处理提供此功能的 LLM

  • pipeline 首次执行时,LLM 会将输入发送到平台。平台将返回作业 ID,稍后可用于检查作业状态并检索结果。LLM 会将其 jobs_ids 属性中保存这些作业 ID,并引发一个特殊的异常 DistilabelOfflineBatchGenerationNotFinishedException,该异常将由 Pipeline 处理。作业 ID 将保存在 pipeline 缓存中,以便在后续调用中使用。
  • 第二次和后续调用将恢复 pipeline 执行,LLM 不会再次将输入发送到平台。这次,因为它有 jobs_ids,它将检查作业是否已完成,如果已完成,则它将检索结果并返回输出。如果它们尚未完成,则它将再次引发 DistilabelOfflineBatchGenerationNotFinishedException
  • 此外,可以指定具有离线批量生成的 LLM 进行轮询,直到作业完成,从而阻止 pipeline 直到它们完成。如果出于某种原因需要停止轮询,可以按 Ctrl+CCmd+C,具体取决于您的操作系统(或向主进程发送 SIGINT),这将停止轮询并引发 DistilabelOfflineBatchGenerationNotFinishedException,该异常将如上所述由 pipeline 处理。

警告

为了恢复 pipeline 执行并检索结果,必须启用 pipeline 缓存。如果 pipeline 缓存被禁用,那么它将再次发送输入并创建不同的作业,从而产生额外的成本。

使用 OpenAILLM 和离线批量生成的示例 pipeline

from distilabel.models import OpenAILLM
from distilabel.pipeline import Pipeline
from distilabel.steps import LoadDataFromHub
from distilabel.steps.tasks import TextGeneration

with Pipeline() as pipeline:
    load_data = LoadDataFromHub(output_mappings={"prompt": "instruction"})

    text_generation = TextGeneration(
        llm=OpenAILLM(
            model="gpt-3.5-turbo",
            use_offline_batch_generation=True,  # (1)
        )
    )

    load_data >> text_generation


if __name__ == "__main__":
    distiset = pipeline.run(
        parameters={
            load_data.name: {
                "repo_id": "distilabel-internal-testing/instruction-dataset",
                "split": "test",
                "batch_size": 500,
            },
        }
    )
  1. 指示 OpenAILLM 应使用离线批量生成。