Ce référentiel fournit une implémentation de Rank-One Model Editing (ROME) sur les transformateurs auto-régressifs (GPU uniquement). Nous prenons actuellement en charge le GPT-2 XL (1,5B) d'OpenAI et le GPT-J (6B) d'EleutherAI. La sortie d'un modèle de type 20B GPT d'EleutherAI est attendue prochainement ; nous espérons le soutenir dès que possible.
N'hésitez pas à ouvrir un ticket si vous rencontrez des problèmes ; nous développons activement ce référentiel et surveillerons de près les tickets.
Nous recommandons conda
pour gérer les dépendances liées à Python, CUDA et PyTorch, et pip
pour tout le reste. Pour commencer, installez simplement conda
et exécutez :
./scripts/setup_conda.sh
notebooks/causal_trace.ipynb
démontre le traçage causal, qui peut être modifié pour appliquer le traçage au traitement de n'importe quelle instruction.
notebooks/rome.ipynb
démontre ROME. L'API est simple ; il suffit de préciser une réécriture demandée de la forme suivante :
request = {
"prompt" : "{} plays the sport of" ,
"subject" : "LeBron James" ,
"target_new" : {
"str" : "football"
}
}
Plusieurs exemples similaires sont inclus dans le cahier.
Les détails arrivent bientôt !
Voir baselines/
pour une description des lignes de base disponibles.
experiments/evaluate.py
peut être utilisé pour évaluer n'importe quelle méthode dans baselines/
. Pour commencer (par exemple en utilisant ROME sur GPT-2 XL), exécutez :
python3 -m experiments.evaluate
--alg_name=ROME
--model_name=gpt2-xl
--hparams_fname=gpt2-xl.json
Les résultats de chaque exécution sont stockés dans results/<method_name>/run_<run_id>
dans un format spécifique :
results/
| __ ROME/
| __ run_ < run_id > /
| __ params.json
| __ case_0.json
| __ case_1.json
| __ ...
| __ case_10000.json
Pour résumer les résultats, vous pouvez utiliser experiments/summarize.py
:
python3 -m experiments.summarize --dir_name=ROME --runs=run_ < run_id >
L'exécution de python3 -m experiments.evaluate -h
ou python3 -m experiments.summarize -h
fournit des détails sur les indicateurs de ligne de commande.
Supposons que vous ayez une nouvelle méthode X
et que vous souhaitiez la comparer sur CounterFact. Pour intégrer X
à notre coureur :
HyperParams
dans XHyperParams
et spécifiez tous les champs d'hyperparamètres. Voir ROMEHyperParameters
pour un exemple d'implémentation.hparams/X/gpt2-xl.json
et spécifiez certaines valeurs par défaut. Voir hparams/ROME/gpt2-xl.json
pour un exemple.apply_X_to_model
qui accepte plusieurs paramètres et renvoie (i) le modèle réécrit et (ii) les valeurs de poids d'origine pour les paramètres qui ont été modifiés (au format dictionnaire {weight_name: original_weight_value}
). Voir rome/rome_main.py
pour un exemple.X
à ALG_DICT
dans experiments/evaluate.py
en insérant la ligne "X": (XHyperParams, apply_X_to_model)
.Enfin, exécutez les scripts principaux :
python3 -m experiments.evaluate
--alg_name=X
--model_name=gpt2-xl
--hparams_fname=gpt2-xl.json
python3 -m experiments.summarize --dir_name=X --runs=run_ < run_id >
Nous ne prenons actuellement en charge que les méthodes qui modifient les modèles HuggingFace autorégressifs à l'aide du backend PyTorch. Nous travaillons sur un ensemble de méthodes à usage général (utilisables par exemple sur TensorFlow et sans HuggingFace) qui seront bientôt publiées.
@article { meng2022locating ,
title = { Locating and Editing Factual Associations in {GPT} } ,
author = { Kevin Meng and David Bau and Alex Andonian and Yonatan Belinkov } ,
journal = { Advances in Neural Information Processing Systems } ,
volume = { 35 } ,
year = { 2022 }
}