1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/fastnlp-fastNLP

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

fastNLP — это лёгкий инструмент для обработки естественного языка (NLP), цель которого — уменьшить объём кода, связанного с обработкой данных, обучением и многопроцессорной работой в проектах пользователей.

Особенности fastNLP:

  • Простота. В обработке данных можно использовать функцию apply, чтобы избежать циклов, и многозадачность для ускорения работы. На этапе обучения можно легко настроить операции.
  • Эффективность. Не нужно изменять код, чтобы реализовать такие функции, как переключение на 16-битную точность, многозадачность и ZeRO-оптимизация.
  • Совместимость. fastNLP поддерживает различные фреймворки глубокого обучения в качестве бэкенда.

Внимание! Чтобы обеспечить совместимость с различными архитектурами глубокого обучения, в версии fastNLP 1.0.0 и выше была переработана архитектура, поэтому она не полностью совместима с предыдущими версиями fastNLP. Для использования более ранних версий fastNLP потребуется внести некоторые изменения в код.

Документация fastNLP

Документация доступна на китайском языке по адресу: http://www.fastnlp.top/docs/fastNLP/master/index.html.

Руководство по установке

fastNLP можно установить с помощью следующей команды:

pip install fastNLP>=1.0.0alpha

Если вам нужна более ранняя версия fastNLP, укажите номер версии, например:

pip install fastNLP==0.7.1

Кроме того, установите соответствующий фреймворк глубокого обучения в зависимости от используемого вами фреймворка.

Pytorch

Вот пример использования PyTorch для классификации текста. Требуется установить torch >= 1.6.0.

from fastNLP.io import ChnSentiCorpLoader
from functools import partial
from fastNLP import cache_results
from fastNLP.transformers.torch import BertTokenizer

# 使用cache_results装饰器装饰函数,将prepare_data的返回结果缓存到caches/cache.pkl,再次运行时,如果
#  该文件还存在,将自动读取缓存文件,而不再次运行预处理代码。
@cache_results('caches/cache.pkl')
def prepare_data():
    # 会自动下载数据,并且可以通过文档看到返回的 dataset 应该是包含"raw_words"和"target"两个field的
    data_bundle = ChnSentiCorpLoader().load()
    # 使用tokenizer对数据进行tokenize
    tokenizer = BertTokenizer.from_pretrained('hfl/chinese-bert-wwm')
    tokenize = partial(tokenizer, max_length=256)  # 限制数据的最大长度
    data_bundle.apply_field_more(tokenize, field_name='raw_chars', num_proc=4)  # 会新增"input_ids", "attention_mask"等field进入dataset中
    data_bundle.apply_field(int, field_name='target', new_field_name='labels')  # 将int函数应用到每个target上,并且放入新的labels field中
    return data_bundle
data_bundle = prepare_data()
print(data_bundle.get_dataset('train')[:4])

# 初始化model, optimizer
from fastNLP.transformers.torch import BertForSequenceClassification
from torch import optim
model = BertForSequenceClassification.from_pretrained('hfl/chinese-bert-wwm')
optimizer = optim.AdamW(model.parameters(), lr=2e-5)

# 准备dataloader
from fastNLP import prepare_dataloader
dls = prepare_dataloader(data_bundle, batch_size=32)

# 准备训练
from fastNLP import Trainer, Accuracy, LoadBestModelCallback, TorchWarmupCallback, Event
callbacks = [
    TorchWarmupCallback(warmup=0.1, schedule='linear'),   # 训练过程中调整学习率。
    LoadBestModelCallback()  # 将在训练结束之后,加载性能最优的model
]
# 在训练特定时机加入一些操作, 不同时机能够获取到的参数不一样,可以通过Trainer.on函数的文档查看每个时机的参数
@Trainer.on(Event.on_before_backward())
def print_loss(trainer, outputs):
    if trainer.global_forward_batches % 10 == 0:  # 每10个batch打印一次loss。
        print(outputs.loss.item())

trainer = Trainer(model=model, train_dataloader=dls['train'], optimizers=optimizer,
                  device=0, evaluate_dataloaders=dls['dev'], metrics={'acc': Accuracy()},
                  callbacks=callbacks, monitor='acc#acc',n_epochs=5,
                  # Accuracy的update()函数需要pred,target两个参数,它们实际对应的就是以下的field。
                  evaluate_input_mapping={'labels': 'target'},  # 在评测时,将dataloader中会输入到模型的labels重新命名为target
                  evaluate_output_mapping={'logits': 'pred'}  # 在评测时,将model输出中的logits重新命名为pred
                  )
trainer.run()

# 在测试集合上进行评测
from fastNLP import Evaluator
evaluator = Evaluator(model=model, dataloaders=dls['test'], metrics={'acc': Accuracy()},
                      # Accuracy的update()函数需要pred,target两个参数,它们实际对应的就是以下的field。
                      output_mapping={'logits': 'pred'},
                      input_mapping={'labels': 'target'})
evaluator.run()

Дополнительные сведения доступны по следующим ссылкам. Подробное использование учебника

  1. Базовое использование Trainer и Evaluator (http://www.fastnlp.top/docs/fastNLP/master/tutorials/basic/fastnlp_tutorial_0.html).

  2. Базовое использование DataSet и Vocabulary (http://www.fastnlp.top/docs/fastNLP/master/tutorials/basic/fastnlp_tutorial_1.html).

  3. Базовое использование DataBundle и Tokenizer (http://www.fastnlp.top/docs/fastNLP/master/tutorials/basic/fastnlp_tutorial_2.html).

  4. Внутренняя структура TorchDataloader и базовое использование (http://www.fastnlp.top/docs/fastNLP/master/tutorials/basic/fastnlp_tutorial_3.html).

  5. Предопределённые модели в fastNLP (http://www.fastnlp.top/docs/fastNLP/master/tutorials/basic/fastnlp_tutorial_4.html).

  6. Глубокое введение в Trainer и Evaluator (http://www.fastnlp.top/docs/fastNLP/master/tutorials/basic/fastnlp_tutorial_4.html).

  7. Сочетание fastNLP с paddle или jittor (http://www.fastnlp.top/docs/fastNLP/master/tutorials/basic/fastnlp_tutorial_5.html).

  8. Завершение классификации SST-2 с помощью Bert + fine-tuning (http://www.fastnlp.top/docs/fastNLP/master/tutorials/basic/fastnlp_tutorial_e1.html).

  9. Завершение классификации SST-2 с помощью Bert + prompt (http://www.fastnlp.top/docs/fastNLP/master/tutorials/basic/fastnlp_tutorial_e2.html).

Paddle

Ниже приведён пример использования Paddle для классификации текста. Необходимо установить Paddle версии 2.2.0 или выше и Paddlenlp версии 2.3.3 или выше.

from fastNLP.io import ChnSentiCorpLoader
from functools import partial

# Автоматически загрузит данные, также можно увидеть из документации, что возвращаемый dataset должен содержать поля «raw_words» и «target».
data_bundle = ChnSentiCorpLoader().load()

# Использование tokenizer для токенизации данных.
from paddlenlp.transformers import BertTokenizer
tokenizer = BertTokenizer.from_pretrained('hfl/chinese-bert-wwm')
tokenize = partial(tokenizer, max_length=256) # Ограничение максимальной длины.
data_bundle.apply_field_more(tokenize, field_name='raw_chars', num_proc=4) # Добавит новые поля «input_ids», «attention_mask» и т. д. в dataset.
data_bundle.apply_field(int, field_name='target', new_field_name='labels') # Применит функцию int к каждому target и поместит результат в новое поле labels.
print(data_bundle.get_dataset('train')[:4])

# Инициализация модели.
from paddlenlp.transformers import BertForSequenceClassification, LinearDecayWithWarmup
from paddle import optimizer, nn
class SeqClsModel(nn.Layer):
    def __init__(self, model_checkpoint, num_labels):
        super(SeqClsModel, self).__init__()
        self.num_labels = num_labels
        self.bert = BertForSequenceClassification.from_pretrained(model_checkpoint)

    def forward(self, input_ids, token_type_ids=None, position_ids=None, attention_mask=None):
        logits = self.bert(input_ids, token_type_ids, position_ids, attention_mask)
        return logits

    def train_step(self, input_ids, labels, token_type_ids=None, position_ids=None, attention_mask=None):
        logits = self(input_ids, token_type_ids, position_ids, attention_mask)
        loss_fct = nn.CrossEntropyLoss()
        loss = loss_fct(logits.reshape((-1, self.num_labels)), labels.reshape((-1, )))
        return {
            "logits": logits,
            "loss": loss,
        }

    def evaluate_step(self, input_ids, token_type_ids=None, position_ids=None, attention_mask=None):
        logits = self(input_ids, token_type_ids, position_ids, attention_mask)
        return {
            "logits": logits,
        }

model = SeqClsModel('hfl/chinese-bert-wwm', num_labels=2)

# Подготовка dataloader.
from fastNLP import prepare_dataloader
dls = prepare_dataloader(data_bundle, batch_size=16)

# Настройка скорости обучения во время тренировки.
scheduler = LinearDecayWithWarmup(2e-5, total_steps=20 * len(dls['train']), warmup=0.1)
optimizer = optimizer.AdamW(parameters=model.parameters(), learning_rate=scheduler)

# Подготовка к тренировке.
from fastNLP import Trainer, Accuracy, LoadBestModelCallback, Event
callbacks = [
    LoadBestModelCallback() # Загрузит модель с наилучшей производительностью после завершения тренировки.
]

@Trainer.on(Event.on_before_backward())
def print_loss(trainer, outputs):
    if trainer.global_forward_batches % 10 == 0: # Выводит loss каждые 10 пакетов.
        print(outputs["loss"].item())

trainer = Trainer(model=model, train_dataloader=dls['train'], optimizers=optimizer,
                  device=0, evaluate_dataloaders=dls['dev'], metrics={'acc':

*В тексте запроса присутствуют фрагменты кода на языке Python, которые не были переведены.* **Текст запроса:**

Accuracy()},
callbacks=callbacks, monitor='acc#acc',
# Accuracy的update()函数需要pred,target两个参数,它们实�cкого对应的就是以下的field。
evaluate_output_mapping={'logits': 'pred'},
evaluate_input_mapping={'labels': 'target'}
)
trainer.run()

# 在测试集合上进行评测
from fastNLP import Evaluator
evaluator = Evaluator(model=model, dataloaders=dls['test'], metrics={'acc': Accuracy()},
                      # Accuracy的update()函数需要pred,target两个参数,它们实�cского对应的就是以下的field。
                      output_mapping={'logits': 'pred'},
                      input_mapping={'labels': 'target'})
evaluator.run()

**Перевод текста запроса на русский язык:**

Аккураси ()},
колбэки = колбэки, монитор = «акк # акк»,
# Функция Аккураси update () требует pred и target в качестве параметров, которые фактически соответствуют следующим полям.
эвалуэйт_оутпут_мэппинг = {'логитс': 'пред'},
эвалюэйт инпут мэппинг = {'лэйблс': 'таргет'}
)
тренер.ран ().

# Провести оценку на тестовом наборе данных
из fastNLP импортировать оценщик
оценщик = оценщик (модель = модель, даталоадеры = ди эл эл эс ['тест'], метрикс = {'акк': Аккураси ()},
# Функция Аккураси update () требует пред и таргет в качестве параметров, которым фактически соответствуют следующие поля.
оутпут мэппинг = {'логитс': 'пред'},
инпут мэппинг = {'лэблс': 'таржет'}
).
оценщик.ран ().

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Описание недоступно Развернуть Свернуть
Apache-2.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/fastnlp-fastNLP.git
git@api.gitlife.ru:oschina-mirror/fastnlp-fastNLP.git
oschina-mirror
fastnlp-fastNLP
fastnlp-fastNLP
master