Продвинутое руководство: загрузка и выгрузка параметров модели (HDFS)
Когда с помощью функции set_hdfs_info(fs_name, fs_ugi, fs_dir_for_save=None, fs_checkpoint_dir=None) задана информация о HDFS, PLSC перед началом тренировки автоматически загрузит параметры облачной тренировочной модели и после окончания тренировки автоматически выгрузит сохранённые параметры модели в указанный каталог HDFS.
Загрузка параметров модели
Пример скрипта для загрузки параметров модели:
from plsc import Entry
if __name__ == "__main__":
ins = Entry()
ins.set_model_save_dir('./saved_model')
ins.set_hdfs_info("you_hdfs_addr", "name,passwd", "some_dir")
ins.train()
Выгрузка параметров модели
Пример скрипта для выгрузки параметров модели:
from plsc import Entry
if __name__ == "__main__":
ins = Entry()
ins.set_checkpoint_dir('./saved_model')
ins.set_hdfs_info("you_hdfs_addr",
"name,passwd",
fs_checkpoint_dir="some_dir")
ins.train()
Этот скрипт выгружает все параметры модели из каталога «some_dir» системы HDFS в локальный каталог «./saved_model». Убедитесь, что каталог «./saved_model» существует.
Преобразование данных изображений в формате Base64
В реальных проектах распространённым форматом хранения тренировочных данных является кодирование данных изображения в формат Base64. В файле тренировочных данных каждая строка содержит данные изображения в формате Base64 и метку этого изображения. Обычно данные разделяются символом табуляции ('\t').
Обычно список файлов с тренировочными данными записывается в отдельный файл, а структура всего набора тренировочных данных выглядит следующим образом:
dataset
|-- file_list.txt
|-- dataset.part1
|-- dataset.part2
... ....
`-- dataset.part10
Здесь file_list.txt содержит список файлов тренировочных данных, каждая строка представляет один файл. Например, содержимое file_list.txt может быть таким:
dataset.part1
dataset.part2
...
dataset.part10
Каждая строка файла данных представляет собой данные одного изображения в формате Base64, а также метку изображения, разделённую символом табуляции.
Для распределённой тренировки необходимо, чтобы каждый графический процессор обрабатывал одинаковое количество данных изображений, и обычно требуется глобальное перемешивание тренировочных данных перед тренировкой.
Это руководство описывает инструмент для преобразования данных изображений в формате Base64, который используется для глобального перемешивания тренировочных данных и разделения тренировочных данных на несколько файлов данных, количество которых совпадает с количеством используемых графических процессоров. Если общее количество тренировочных данных не делится нацело на количество графических процессоров, то некоторые данные изображений будут добавлены (добавленные данные выбираются случайным образом из набора тренировочных данных), чтобы гарантировать, что общее количество изображений является целым числом, кратным количеству графических процессоров, т. е. каждый файл данных содержит одинаковое количество изображений.
Использование инструмента
Инструмент находится в каталоге tools. Для его использования необходимо установить модуль sqlite3. Это можно сделать с помощью следующей команды:
pip install sqlite3
Информацию о том, как использовать инструмент, можно получить с помощью следующей командной строки:
python tools/process_base64_files.py --help
Инструмент поддерживает следующие параметры командной строки:
Можно запустить инструмент с помощью следующей командной строки:
python tools/process_base64_files.py --data_dir=./dataset --file_list=file_list.txt --nranks=8
После этого будет создано 8 файлов данных, каждый из которых содержит одинаковое количество тренировочных данных.
Данные изображений в формате Base64 можно прочитать с помощью plsc.utils.base64_reader.
Смешанная точность тренировки PLSC поддерживает смешанную точность тренировки. Использование смешанной точности тренировки может ускорить тренировку и уменьшить использование видеопамяти.
Руководство по использованию Чтобы включить смешанную точность тренировки, используйте следующий код:
from plsc import Entry
def main():
ins = Entry()
ins.set_mixed_precision(True)
ins.train()
if __name__ == "__main__":
main()
Функция set_mixed_precision имеет 7 параметров, из которых use_fp16 является обязательным и определяет, следует ли включать смешанную точность тренировки. Остальные 6 параметров имеют значения по умолчанию.
Параметр | Тип | Значение по умолчанию | Описание |
---|---|---|---|
use_fp16 | bool | Нет, должно быть установлено пользователем | Следует ли включать смешанную точность тренировки; если установлено значение True, включается смешанная точность тренировки |
init_loss_scaling | float | 1.0 | Начальное значение масштабирования потерь, которое может повлиять на точность смешанной тренировки точности; рекомендуется использовать значение по умолчанию |
incr_every_n_steps | int | 2000 | Если потери не превышают FP16 в течение incr_every_n_steps шагов, loss_scaling будет увеличиваться в incr_ratio раз; рекомендуется использовать значение по умолчанию |
decr_every_n_nan_or_inf | int | 2 | Если потери превышают FP16 в течение decr_every_n_nan_or_inf шагов, loss_scaling уменьшается до исходного значения decr_ratio; рекомендуется использовать значение по умолчанию |
incr_ratio | float | 2.0 | Коэффициент увеличения loss_scaling; рекомендуется использовать значение по умолчанию |
decr_ratio | float | 0.5 | Коэффициент уменьшения loss_scaling; рекомендуется использовать значение по умолчанию |
use_dynamic_loss_scaling | bool | True | Следует ли использовать механизм динамического масштабирования потерь. Если он включён, используются параметры incr_every_n_steps, decr_every_n_nan_or_inf, incr_ratio и decr_ratio. Рекомендуется использовать значение по умолчанию |
amp_lists | AutoMixedPrecisionLists класс | None | Класс списков автоматической смешанной точности, который может указывать конкретные операторы, использующие вычисления fp16; рекомендуется использовать значение по умолчанию |
Дополнительные сведения о смешанной тренировке точности см. в следующих источниках:
Paper: MIXED PRECISION TRAINING
Nvidia Introduction: Training With Mixed Precision
Производительность тренировки Конфигурация: Nvidia Tesla v100 GPU, одиночная машина, 8 карт
Модель \ Скорость | Тренировка FP32 | Смешанная тренировка точности | Коэффициент ускорения |
---|---|---|---|
ResNet50 | 2567,96 изображений/с | 3643,11 изображений/с | 1,42 |
Примечание: Для обеих моделей используется тип потерь 'dist_arcface'.
Пользовательская модель По умолчанию PLSC строит тренировочную модель на основе ResNet50.
PLSC предоставляет базовый класс модели plsc.models.base_model.BaseModel, который позволяет пользователям создавать собственные сетевые модели. Пользовательский класс модели должен наследовать от этого базового класса и реализовывать метод build_network для создания пользовательской модели.
Следующий пример показывает, как определить пользовательскую модель с использованием базового класса BaseModel и как её использовать:
import paddle.fluid as fluid
from plsc import Entry
from plsc.models.base_model import BaseModel
class ResNet(BaseModel):
def __init__(self, layers=50, emb_dim=512):
super(ResNet, self).__init__()
self.layers = layers
self.emb_dim = emb_dim
def build_network(self,
input,
label,
... **Пользовательский класс модели должен наследоваться от базового класса BaseModel и реализовывать метод build_network.**
**Входные данные метода build_network:**
* input: входные данные изображения;
* label: категория изображения;
* is_train: указывает на этап обучения.
Метод build_network возвращает выходные данные пользовательской сети.
## **Использование пользовательских данных для обучения**
По умолчанию предполагается, что данные для обучения организованы следующим образом:
```shell script
train_data/
|-- images
`-- label.txt
Здесь в каталоге images хранятся данные для обучения, а в файле label.txt — адреса изображений и соответствующие им метки.
Если данные для обучения имеют другую структуру, то можно использовать следующие шаги:
Для простоты описания мы всё ещё предполагаем, что структура данных для обучения выглядит так:
train_data/
|-- images
`-- label.txt
Код для определения генератора образцов данных (reader.py):
import random
import os
from PIL import Image
def arc_train(data_dir):
label_file = os.path.join(data_dir, 'label.txt')
train_image_list = None
with open(label_file, 'r') as f:
train_image_list = f.readlines()
train_image_list = get_train_image_list(data_dir)
def reader():
for j in range(len(train_image_list)):
path, label = train_image_list[j]
path = os.path.join(data_dir, path)
img = Image.open(path)
if random.randint(0, 1) == 1:
img = img.transpose(Image.FLIP_LEFT_RIGHT)
if img.mode != 'RGB':
img = img.convert('RGB')
img = np.array(img).astype('float32').transpose((2, 0, 1))
yield img, label
return reader
Пример кода для использования пользовательских данных при обучении:
import argparse
import paddle
from plsc import Entry
import reader
parser = argparse.ArgumentParser()
parser.add_argument("--data_dir",
type=str,
default="./data",
help="Directory for datasets.")
args =
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.