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

OSCHINA-MIRROR/paddlepaddle-PLSC

Клонировать/Скачать
advanced.md 16 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 29.11.2024 15:58 40a2132

Продвинутое руководство: загрузка и выгрузка параметров модели (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

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

  • data_dir: корневой каталог тренировочных данных;
  • file_list: файл со списком файлов тренировочных данных, например file_list.txt;
  • nranks: количество используемых графических процессоров.

Можно запустить инструмент с помощью следующей командной строки:

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; рекомендуется использовать значение по умолчанию

Дополнительные сведения о смешанной тренировке точности см. в следующих источниках:

Производительность тренировки Конфигурация: 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 — адреса изображений и соответствующие им метки.

Если данные для обучения имеют другую структуру, то можно использовать следующие шаги:

  1. Определить функцию reader, которая будет предварительно обрабатывать данные (например, обрезать) и генерировать образцы данных с помощью yield. Формат образца данных — это кортеж вида (data, label), где data — обработанные данные изображения, а label — метка изображения.
  2. Использовать paddle.batch для упаковки генератора reader и получить новый генератор batched_reader.
  3. Присвоить значение batched_reader члену train_reader экземпляра класса plsc.Entry.

Для простоты описания мы всё ещё предполагаем, что структура данных для обучения выглядит так:

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 =
1
https://api.gitlife.ru/oschina-mirror/paddlepaddle-PLSC.git
git@api.gitlife.ru:oschina-mirror/paddlepaddle-PLSC.git
oschina-mirror
paddlepaddle-PLSC
paddlepaddle-PLSC
master