Hub documentation
Zephon
Zephon
Zephon est un chargeur de données pour l’entraînement de modèles de fondation, développé par DatologyAI.
Il tokenise, agrège et mélange les données pendant l’exécution de l’entraînement, et il fournit les mêmes lots lorsque le nombre de GPU est modifié (déterminisme élastique).
Zephon lit les jeux de données directement depuis le Hugging Face Hub via des chemins hf://.
Installation
L’extra hf ajoute la prise en charge des jeux de données du Hub et des fichiers Parquet. Les exemples ci-dessous nécessitent également transformers pour la tokenisation :
pip install "zephon[hf]" transformersCharger un jeu de données depuis le Hub
Passez un chemin hf:// à Dataset.from_path. Le chemin désigne un jeu de données, une configuration et un split, par exemple le split train de la configuration sample-10BT de HuggingFaceFW/fineweb-edu.
Zephon lit les jeux de données du Hub via son cache de shards, il faut donc activer le cache. Placez le cache sur un disque local rapide et définissez une limite de taille :
from zephon import Pipeline
from zephon.io import CacheOptions, Dataset, StoreOptions
from zephon.work import MixtureSpec, StaticMixtureWorkSource
dataset = Dataset.from_path("fineweb_edu", "hf://HuggingFaceFW/fineweb-edu/sample-10BT/train")
work_source = StaticMixtureWorkSource(
datasets=[dataset],
mixture=MixtureSpec({"fineweb_edu": 1.0}),
seed=42,
)
cache = CacheOptions(enabled=True, root="/tmp/zephon-cache", limit_bytes=50 << 30) # 50 GiB
pipeline = (
Pipeline(work_source)
.options(io_options=StoreOptions(cache=cache))
.tokenize(tokenizer_id="gpt2", field="text")
.pack_flat(max_length=2049, algorithm="wrap")
.batch(microbatch_size=8)
)
for batch in pipeline:
tensors = batch.to_training(return_labels=True)
print(tensors["input_ids"].shape, tensors["labels"].shape) # (8, 2048) (8, 2048)
breaktokenize convertit la colonne text en identifiants de jetons. pack_flat assemble les documents tokenisés en séquences de max_length jetons. Définissez max_length sur la longueur du contexte plus un : avec return_labels=True, to_training décale les étiquettes d’une position, de sorte que input_ids et labels aient tous deux la longueur du contexte.
Un Pipeline est un itérable Python, vous pouvez donc l'utiliser dans n'importe quelle boucle d'entraînement. Zephon télécharge un shard complet avant d'y lire, ce qui peut prendre un certain temps pour le premier lot.
Pour lire des jeux de données privés ou protégés, connectez-vous d’abord avec votre compte Hugging Face, par exemple avec hf auth login. Zephon lit également la variable d’environnement HF_TOKEN.
Format du chemin
Les chemins hf:// de Zephon pour les jeux de données du Hub ont ce format :
hf://{org}/{name}[@[{revision}][~{source}]]/[{config}/]{split}revision: une branche, un tag ou un commit. La valeur par défaut estmain. Zephon fixe le chemin vers un commit lors du chargement du jeu de données, afin que tous les rangs lisent les mêmes fichiers.source:originallit les fichiers téléversés dans le dépôt, etparquetlit la conversion automatique en Parquet du Hub. Placez la source après le@, par exemple@~parquet. Par défaut, Zephon lit les fichiers téléversés s’il prend en charge leur format, et utilise la conversion Parquet dans le cas contraire.config: la configuration du jeu de données. À inclure lorsque le jeu de données comporte plus d’une configuration.
| Chemin | Lecture |
|---|---|
hf://HuggingFaceFW/fineweb-edu/sample-10BT/train | La partition train de la configuration sample-10BT, issue de la branche main |
hf://HuggingFaceFW/fineweb-edu@v1.4.0/sample-10BT/train | La même séparation depuis la branche v1.4.0 |
hf://yahma/alpaca-cleaned@~parquet/train | La partition train de la conversion Parquet automatique |
Les chemins Zephon désignent un jeu de données et un split, et non un fichier. Ils n’utilisent pas les chemins de fichiers
hf://datasets/...utilisés par pandas, Polars et DuckDB. Utilisezhf://HuggingFaceFW/fineweb-edu/sample-10BT/train, et nonhf://datasets/HuggingFaceFW/fineweb-edu/sample-10BT/train.
Mélanger des jeux de données
Pour entraîner sur plusieurs jeux de données du Hub, ajoutez-les à la source de travail avec la proportion de chacun. Cet exemple mélange FineWeb-Edu avec Wikipédia en anglais, en visant un mélange de 70/30 par jetons :
from zephon import Pipeline
from zephon.io import CacheOptions, Dataset, StoreOptions
from zephon.work import MixtureSpec, StaticMixtureWorkSource, TokenEstimation
work_source = StaticMixtureWorkSource(
datasets=[
Dataset.from_path("fineweb_edu", "hf://HuggingFaceFW/fineweb-edu/sample-10BT/train"),
Dataset.from_path("wikipedia", "hf://wikimedia/wikipedia/20231101.en/train"),
],
mixture=MixtureSpec({"fineweb_edu": 0.7, "wikipedia": 0.3}),
seed=42,
token_estimation=TokenEstimation(primer="measure", calibration_samples=2048, calibration_shards_max=4),
)
cache = CacheOptions(enabled=True, root="/tmp/zephon-cache", limit_bytes=50 << 30) # 50 GiB
pipeline = (
Pipeline(work_source)
.options(io_options=StoreOptions(cache=cache))
.tokenize(tokenizer_id="gpt2", field="text")
.pack_flat(max_length=2049, algorithm="wrap")
.batch(microbatch_size=8)
)Pour mélanger par échantillons plutôt que par jetons, omettez token_estimation.