BigQuery 与本地令牌化 | AI生成和翻译

Home 2026.06

问题:当LLM对大Parquet文件进行分词时,CPU在某些情况下可能挂起或停滞。BigQuery是否已经为您处理了这种大规模处理?

回答:

让我区分一下您混为一谈的两件不同事情,因为答案对每个都不一样。

1. CPU 在大 Parquet 上“挂起”——实际发生了什么

当您本地对一个大的 Parquet 进行分词,CPU 出现停滞时,几乎从来不是因为分词器本身慢。通常是以下原因之一:

本地解决办法是流式处理行组并进行批量分词:

import pyarrow.parquet as pq
from transformers import AutoTokenizer

tok = AutoTokenizer.from_pretrained("gpt2")
pf = pq.ParquetFile("big.parquet")

for batch in pf.iter_batches(batch_size=10_000, columns=["text"]):
    texts = batch.column("text").to_pylist()
    enc = tok(texts, truncation=True, max_length=1024)  # 批量处理,Rust,多核
    # 将编码结果写入分片(np.memmap / .bin)——不要保留在内存中

这是 nanoGPT/nanochat 的 prepare.py 模式:流式读取 → 批量分词 → 写入连续的 uint16 .bin 分片。CPU 永远不会挂起,因为通过批次限制了内存,并且 Rust 分词器在批次内并行化。

2. “BigQuery 能处理吗?”——能,但它解决的是不同的问题

BigQuery 是一个列式、分布式 OLAP 数据仓库(底层是 Dremel)。它绝对解决了“大 Parquet 放不下 / 单 CPU 停滞”的问题——但针对的是 SQL 风格的转换,而不是运行分词器。

BigQuery 免费为您提供:

因此,如果您的“分词”是 BigQuery SQL 能表达的操作,那么答案是肯定的,它可以处理。而且现在越来越可以了:

但有一个明显的边界:BigQuery 不会运行您的 HuggingFace 分词器。没有原生的“将这段文本分词为 GPT-2 BPE ID”的 SQL 函数。如果您想要您特定的分词器(与您正在训练的模型匹配的那个),您有以下选择:

对于您的训练管道的实际答案

对于 nanoGPT 规模到 DeepSeek-v4 规模的数据准备,AI 原生的分工如下:

  1. BigQuery 负责繁重的数据工程 —— 去重、语言过滤、质量评分、采样、连接。这是“我的机器放不下”的终结。让 Dremel 吞噬 TB 级数据。
  2. 自己流式分词清理后的输出 —— 因为分词器必须与您的模型完全匹配,并且您需要连续的 .bin 分片以实现快速的训练数据加载。在拥有 CPU 核心的地方(工作站)或在 GPU 旁边的机器上运行它。

BigQuery 解决了规模问题。它没有解决分词器保真度问题。不要试图将 BPE 分词强行塞入 SQL——这是您保留在本地/自行掌控的那一部分,并且上述流式批处理模式意味着无论语料多大,它都不会挂起。

如果您告诉我您的实际语料大小以及您正在准备哪个分词器/模型,我将为您提供精确的 prepare.py,其中包含针对您的 MI300X 加载器调整的分片大小。


Back Donate