Любая модель глубокого обучения состоит из двух фаз — обучения и логического вывода. Обе фазы так же важны, как и другая. Фаза обучения представляет собой итеративный процесс — мы итерируем, чтобы найти оптимальные гиперпараметры, оптимальную архитектуру нейронной сети, обновление модели, и так далее. Этот итеративный процесс требует больших вычислительных ресурсов и времени.

С другой стороны, развернутая модель должна обслуживать миллионы запросов с малой задержкой. Кроме того, в реальном сценарии это множество моделей, а не одна модель, которые действуют на запросы пользователя для получения желаемого ответа. Например, в случае голосового помощника модели распознавания речи, обработки естественного языка и синтеза речи работают одна за другой последовательно. Следовательно, очень важно, чтобы наш конвейер глубокого обучения оптимально использовал все доступные вычислительные ресурсы, чтобы обеспечить эффективность обеих фаз во всех отношениях.

Графические процессоры (GPU) являются наиболее эффективными вычислительными ресурсами для параллельной обработки. Они массово параллельны тысячам ядер CUDA и сотням ядер Tensor. Пользователь должен наилучшим образом использовать доступный ресурс графического процессора, чтобы сделать конвейер эффективным. В этой статье рассматриваются четыре инструмента из набора инструментов NVIDIA, которые можно легко интегрировать в конвейер глубокого обучения, повышая его эффективность.

  1. Библиотека загрузки данных — DALI
  2. Специально построенные предварительно обученные модели
  3. ТензорРТ
  4. Сервер логических выводов Triton

Библиотека загрузки данных — DALI

Как обсуждалось ранее, GPU — это огромная вычислительная машина, но данные должны подаваться на вычислительные ядра с той же скоростью, с которой они обрабатываются. Только тогда графические процессоры используются оптимально, в противном случае ядрам графических процессоров приходится ждать данных, что делает их недоиспользованными.

На рисунке ниже показан типичный конвейер глубокого обучения.

Обычно загрузка и предварительная обработка данных выполняются ЦП, а предварительно обработанные данные передаются в ГП для обучения. Соотношение ядер ЦП и ГП увеличивается с каждым днем, ЦП не в состоянии идти в ногу с темпами предварительной обработки данных и подачи графических процессоров для обучения, что создает узкое место.

Здесь на помощь приходит DALI. ЦП выполняет только часть загрузки данных, тогда как предварительная обработка и дополнение данных выполняются графическим процессором.

class GPUPipeline(Pipeline):
    def __init__(self, batch_size, num_threads, device_id):
        super(RandomRotatedGPUPipeline, self).__init__(batch_size,   num_threads, device_id, seed = 12)
        self.input = ops.FileReader(file_root = image_dir, random_shuffle = True, initial_fill = 21)
        self.decode = ops.ImageDecoder(device = 'cpu', output_type = types.RGB)
        self.rotate = ops.Rotate(device = "gpu")
        self.rng = ops.Uniform(range = (-10.0, 10.0))

    def define_graph(self):
        jpegs, labels = self.input()
        images = self.decode(jpegs)
        angle = self.rng()
        rotated_images = self.rotate(images.gpu(), angle = angle)
        return (rotated_images, labels)

В приведенном выше фрагменте кода загрузка и декодирование данных выполняются ЦП, тогда как увеличение данных (поворот в этом примере) выполняется ГП.

Как и ожидалось, приведенный выше тест доказывает, что DALI может обеспечить огромный прирост производительности при увеличении соотношения ЦП и ГП. В DGX-1 на каждый GPU приходится 5 ядер ЦП, тогда как в DGX-2 на каждый GPU приходится только 3 ядра ЦП.

Специально созданные предварительно обученные модели

Трансферное обучение — это метод, при котором модель глубокого обучения, обученная на огромном наборе данных, таком как ImageNet, может использоваться для других приложений с минимальным набором данных и минимальным обучением. Такие модели, как YOLO и BERT, обучаются на огромном наборе данных с использованием огромных вычислительных кластеров. Благодаря трансферному обучению эти предварительно обученные модели можно легко адаптировать для нашего приложения с минимальными архитектурными изменениями.

NVIDIA подняла эту концепцию переноса обучения на новый уровень с помощью специально созданных предварительно обученных моделей, доступных в NVIDIA GPU Cloud (NGC). Таких моделей мало,

Модели умного города

  1. DashCamNet
  2. Обнаружение лица
  3. PeopleNet
  4. TrafficCamNet
  5. VehicleTypeNet

Модели медицинских наук

  1. Сегментация опухоли головного мозга
  2. Сегментация печени и опухоли
  3. Сегментация селезенки
  4. Классификация рентгенографии грудной клетки

ТензорРТ

Глубокое обучение имеет широкий спектр приложений, таких как самоуправляемые автомобили, воздушное наблюдение, решения для распознавания лиц в реальном времени, решения для обработки языка в реальном времени и многие другие. Но есть только одно сходство между этими приложениями. РЕАЛЬНОЕ ВРЕМЯ. Учитывая потребность в производительности (пропускной способности) этих моделей в реальном времени, нам необходимо оптимизировать обученную модель, чтобы она была облегченной, но обеспечивала точность, близкую к обучающей.

TensorRT — это платформа глубокого обучения для логического вывода от NVIDIA. Он построен на модели программирования NVIDIA CUDA, которая помогает нам использовать огромную параллельную производительность, предлагаемую графическими процессорами NVIDIA. Модели глубокого обучения практически из всех популярных фреймворков можно анализировать и оптимизировать для получения выводов с низкой задержкой и высокой пропускной способностью на графических процессорах NVIDIA с использованием TensorRT.

С TensorRT мы можем легко выполнять различные оптимизации. Ниже приведены несколько важных оптимизаций, которые можно выполнить с помощью TensorRT.

1. Вывод смешанной точности

2. Слияние слоев

3. Пакетирование

Мои наблюдения с использованием движка TensorRT с точностью FP16

1. Не было большого прироста производительности, когда моя модель была очень мелкой. Например, всего с 6 слоями свертки, за которыми следуют соответствующие слои активации ReLU и пара полносвязных слоев, я не увидел значительного прироста пропускной способности.

2. Когда я увеличил глубину модели до 20 слоев свертки, за которыми следуют соответствующие слои ReLU и пара полносвязных слоев, я смог увидеть значительный прирост производительности. Я заметил увеличение пропускной способности в 3 раза.

3. Движок TensorRT был примерно вдвое меньше родной модели PyTorch, как и ожидалось.

Сервер логических выводов Triton

Теперь, когда у нас есть целая куча обученных моделей, нам нужно развернуть эти модели таким образом, чтобы они обслуживали миллионы пользовательских запросов с минимально возможной задержкой. Усложняет ситуацию то, что модели могут не принадлежать одной и той же структуре.

Triton Inference Server предоставляет службу логического вывода через конечную точку HTTP/REST или GRPC со следующими преимуществами:

  1. Поддержка нескольких фреймворков
  2. Параллельное выполнение модели
  3. Поддержка ансамбля моделей
  4. Поддержка нескольких графических процессоров
  5. Пакетная обработка входных данных

Обученные модели должны быть помещены в репозиторий моделей. Когда для модели поступает запрос на вывод, для модели создается экземпляр исполнения, и Triton Inference Server планирует их обработку базовым оборудованием. Если для одной и той же модели поступает несколько запросов на вывод, либо они могут обслуживаться последовательно, либо несколько экземпляров выполнения одной и той же модели будут создаваться и обслуживаться параллельно.

Несколько моделей или несколько экземпляров одной и той же модели могут обслуживаться параллельно одним графическим процессором с аппаратным планированием. Кроме того, поддержка нескольких графических процессоров Triton помогает масштабировать вычислительные ресурсы, тем самым помогая пользователю удовлетворить требования к задержке и пропускной способности во время развертывания.

За последнее десятилетие глубокое обучение сильно развилось из-за большего количества данных, мощных вычислений и интеллектуальных архитектур моделей. В этом путешествии NVIDIA сыграла важную роль благодаря своим вычислениям на GPU, а также интеллектуальным инструментам и библиотекам. Подготовка данных, обучение и вывод — все три блока конвейера глубокого обучения ускоряются с помощью этих четырех инструментов от NVIDIA.

Справочник

  1. https://docs.nvidia.com/deeplearning/dali/user-guide/docs/index.html
  2. https://developer.nvidia.com/transfer-learning-toolkit
  3. https://developer.nvidia.com/tensorrt
  4. https://docs.nvidia.com/deeplearning/triton-inference-server/user-guide/docs/