
Este repositório fornece o código para o treinamento de modelos pré -traidos japoneses. Este código foi usado para produzir japonês-GPT2-medium, japonês-GPT2-Small e japonês-roberta-Base lançado no HUGGINGFFPED Hub por Rinna Co., Ltd.
Os modelos atualmente apoiados incluem: GPT-2, Roberta.
| Índice |
|---|
| Atualizar log |
| Use dicas |
| Use nossos modelos pré -rastreados via Huggingface |
Treine japanese-gpt2-xsmall do zero |
Treine japanese-roberta-base do zero |
| Licença |
Abra um problema (em inglês/japonês) se você encontrar algum problema usando o código ou usando nossos modelos via HuggingFace.
Se você achar esse trabalho útil, cite o seguinte artigo:
@article{rinna_pretrained2021,
title={日本語自然言語処理における事前学習モデルの公開},
author={趙 天雨 and 沢田 慶},
journal={人工知能学会研究会資料 言語・音声理解と対話処理研究会},
volume={93},
pages={169-170},
year={2021},
doi={10.11517/jsaislud.93.0_169}
}
2022/01/25 Link atualizado para rinna/japanese-gpt-1b na tabela de resumo do modelo.
2022/01/17 Informações de citação atualizadas.
2021/11/01 Links de corpora atualizados.
2021/09/13 Adicionado dicas sobre o uso position_ids com japanese-roberta-base . Consulte a edição 3 para obter detalhes.
2021/08/26 [IMPORTANTE] Licença atualizada da licença do MIT para a licença Apache 2.0 devido ao uso do código de pré-processamento de pré-processamento da Wikipedia de Cl-tohoku/Bert-Japenese. Veja a edição 1 para obter detalhes.
2021/08/23 Adicionou a Wikipedia japonesa ao treinamento de corpora. Código publicado para treinamento rinna/japanese-gpt2-small , rinna/japanese-gpt2-xsmall e rinna/japanese-roberta-base .
japanese-gpt2 japanese-pretrained-models
2021/06/15 Corrigido o melhor bug de rastreamento de ppl ao usar um ponto de verificação.
2021/05/04 Corrigido o erro de semeadura aleatória para treinamento multi-GPU.
2021/04/06 Código publicado para treinamento rinna/japanese-gpt2-medium .
rinna/japanese-roberta-base Use [CLS] : Para prever um token mascarado, adicione um token [CLS] antes da frase para que o modelo o codifique corretamente, como é usado durante o treinamento do modelo.
Use [MASK] após a tokenização: a) digitando diretamente [MASK] em uma sequência de entrada e b) substituindo um token por [MASK] após a tokenização produzirá diferentes seqüências de token e, portanto, diferentes resultados de previsão. É mais apropriado usar [MASK] após a tokenização (pois é consistente com a forma como o modelo foi pré -treinado). No entanto, a API de inferência Huggingface suporta apenas digitar [MASK] na sequência de entrada e produz previsões menos robustas.
Forneça position_ids como um argumento explicitamente: Quando position_ids não são fornecidos para um modelo Roberta* , transformers do Huggingface o construirão automaticamente, mas começam em padding_idx em vez de 0 (consulte a questão e função padding_idx create_position_ids_from_input_ids() na implementação de Hugging), que não funciona como esperado com rinna/japanese-roberta-base não 0 . Portanto, certifique -se de construir os position_ids sozinho e faça com que ele comece a partir do ID da posição 0 .
| Modelo de idioma | # params | # camadas | # EMB DIM | #epochs | dev ppl | tempo de treinamento* |
|---|---|---|---|---|---|---|
| Rinna/Japanese-GPT-1B | 1.3b | vinte e quatro | 2048 | 10+ | 13.9 | n / D** |
| Rinna/Japanese-GPT2-Médio | 336m | vinte e quatro | 1024 | 4 | 18 | 45 dias |
| Rinna/Japanese-Gpt2-Small | 110m | 12 | 768 | 3 | vinte e um | 15 dias |
| rinna/japonês-gpt2-xsmall | 37m | 6 | 512 | 3 | 28 | 4 dias |
| Modelo de linguagem mascarada | # params | # camadas | # EMB DIM | #epochs | dev ppl | tempo de treinamento* |
|---|---|---|---|---|---|---|
| rinna/japonês-roberta-base | 110m | 12 | 768 | 8 | 3.9 | 15 dias |
* O treinamento foi realizado em uma máquina 8x V100 32GB.
** O treinamento foi realizado usando uma base de código diferente e um ambiente de computação diferente.
rinna/japanese-roberta-base para prever o token mascarado import torch
from transformers import T5Tokenizer, RobertaForMaskedLM
# load tokenizer
tokenizer = T5Tokenizer.from_pretrained("rinna/japanese-roberta-base")
tokenizer.do_lower_case = True # due to some bug of tokenizer config loading
# load model
model = RobertaForMaskedLM.from_pretrained("rinna/japanese-roberta-base")
model = model.eval()
# original text
text = "4年に1度オリンピックは開かれる。"
# prepend [CLS]
text = "[CLS]" + text
# tokenize
tokens = tokenizer.tokenize(text)
print(tokens) # output: ['[CLS]', '▁4', '年に', '1', '度', 'オリンピック', 'は', '開かれる', '。']']
# mask a token
masked_idx = 5
tokens[masked_idx] = tokenizer.mask_token
print(tokens) # output: ['[CLS]', '▁4', '年に', '1', '度', '[MASK]', 'は', '開かれる', '。']
# convert to ids
token_ids = tokenizer.convert_tokens_to_ids(tokens)
print(token_ids) # output: [4, 1602, 44, 24, 368, 6, 11, 21583, 8]
# convert to tensor
token_tensor = torch.LongTensor([token_ids])
# provide position ids explicitly
position_ids = list(range(0, token_tensor.size(1)))
print(position_ids) # output: [0, 1, 2, 3, 4, 5, 6, 7, 8]
position_id_tensor = torch.LongTensor([position_ids])
# get the top 10 predictions of the masked token
with torch.no_grad():
outputs = model(input_ids=token_tensor, position_ids=position_id_tensor)
predictions = outputs[0][0, masked_idx].topk(10)
for i, index_t in enumerate(predictions.indices):
index = index_t.item()
token = tokenizer.convert_ids_to_tokens([index])[0]
print(i, token)
"""
0 総会
1 サミット
2 ワールドカップ
3 フェスティバル
4 大会
5 オリンピック
6 全国大会
7 党大会
8 イベント
9 世界選手権
"""
japanese-gpt2-xsmall do zeroInstale os pacotes necessários executando o seguinte comando no diretório repo:
pip install -r requirements.txt
python -m unidic download
Download de treinamento corpus japonês cc-100 e extraia o arquivo ja.txt .
Mova o arquivo ja.txt ou modifique src/corpus/jp_cc100/config.py para corresponder ao filepath de ja.txt com self.raw_data_dir no arquivo de configuração.
Divida ja.txt em arquivos menores executando:
cd src/
python -m corpus.jp_cc100.split_to_small_files
self.download_link (no arquivo src/corpus/jp_wiki/config.py ) com o link para sua versão preferida da Wikipedia. Em seguida, faça o download do treinamento da Wikipedia japonesa do Corpus e dividi -la em execução: python -m corpus.jp_wiki.build_pretrain_dataset
python -m corpus.jp_wiki.split_to_small_files
CUDA_VISIBLE_DEVICES=0,1,2,3 python -m task.pretrain_gpt2.train
--n_gpus 4
--save_model True
--enable_log True
--model_size xsmall
--model_config_filepath model/gpt2-ja-xsmall-config.json
--batch_size 20
--eval_batch_size 40
--n_training_steps 1600000
--n_accum_steps 3
--init_lr 0.0007
Suponha que você tenha executado o script de treinamento e salvou seu GPT-2 de tamanho XSMall para data/model/pretrain_gpt2/gpt2-ja-xsmall-xxx.checkpoint . Execute o seguinte comando para usá -lo para concluir o texto em uma GPU por amostragem de núcleo com p=0.95 e k=40 :
CUDA_VISIBLE_DEVICES=0 python -m task.pretrain_gpt2.interact
--checkpoint_path ../data/model/pretrain_gpt2/gpt2-ja-medium-xxx.checkpoint
--gen_type top
--top_p 0.95
--top_k 40
Faça sua conta Huggingface. Crie um repo modelo. Clone -o para sua máquina local.
Crie arquivos de modelo e configuração de um ponto de verificação executando:
python -m task.pretrain_gpt2.checkpoint2huggingface
--checkpoint_path ../data/model/gpt2-medium-xxx.checkpoint
--save_dir {huggingface's model repo directory}
python -m task.pretrain_gpt2.check_huggingface
--model_dir {huggingface's model repo directory}
Verifique os argumentos disponíveis do script de treinamento GPT-2 executando:
python -m task.pretrain_gpt2.train --help
japanese-roberta-base do zeroSuponha que você tenha terminado o processo de construção de dados, conforme descrito acima, execute o seguinte comando para treinar um Roberta japonês de tamanho base, por exemplo, 8 GPUs V100:
CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 python -m task.pretrain_roberta.train
--n_gpus 8
--save_model True
--enable_log True
--model_size base
--model_config_filepath model/roberta-ja-base-config.json
--batch_size 32
--eval_batch_size 32
--n_training_steps 3000000
--n_accum_steps 16
--init_lr 0.0006
A licença Apache 2.0