Поделиться через


Заметки о выпуске CNTK версии 2.2

Критическое изменение

  • Для этой итерации требуется cuDNN 6.0 для поддержки дилатированного сверток и детерминированного пула. Обновите cuDNN.
  • Для этой итерации требуется OpenCV для поддержки функции образа TensorBoard. Перед установкой CNTK установите OpenCV.

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

Добавьте HTML-версию учебников и руководств, чтобы они могли быть доступны для поиска.

Мы добавили html-версии учебников и руководств с Python документацией. Это также делает записные книжки учебников и руководства для поиска.

Обновленные документы оценки

Обновлены документы, связанные с оценкой модели. Проверьте последние документы здесь.

Система

16-разрядная поддержка обучения на GPU Volta (ограниченная функциональность)

Эта работа перевернется в следующий выпуск из-за зависимости от обновлений тестовой инфраструктуры.

Поддержка NCCL 2

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

  • После установки загруженного пакета NCCL 2 существует два пакета:
/var/nccl-repo-2.0.4-ga/libnccl2_2.0.4-1+cuda8.0_amd64.deb
/var/nccl-repo-2.0.4-ga/libnccl-dev_2.0.4-1+cuda8.0_amd64.deb.

Установите оба из них для сборки CNTK с NCCL 2.

  • Из-за проблем в конфигурации системы пользователь может столкнуться с ошибкой во время инициализации NCCL. Чтобы получить подробные сведения о сбое, задайте переменную NCCL_DEBUG=INFOсреды.
  • Существуют известные проблемы в текущем выпуске NCCL 2 в системе, настроенной с устройствами InfiniBand, работающими в смешанных режимах IB и IPoIB. Чтобы использовать только устройства в режиме IB, задайте переменную среды, выполняемую NCCL_IB_HCA=devices в режиме IB, например:
export NCCL_IB_HCA=mlx5_0,mlx5_2

обновление интерфейса CNTK learner

Это обновление упрощает API-интерфейсы учащихся и нерекомендует основные понятия unitType.minibatch и UnitType.sample. Цель заключается в том, чтобы сделать API интуитивно понятным, чтобы указать гиперпараметров учащихся, сохраняя уникальные методы обновления модели в CNTK --- средние градиенты каждого примера N способствуют примерно одинаковым обновлениям модели независимо от фактических размеров мини-пакетов данных. Подробное объяснение можно найти в руководстве по использованию CNTK Learners.

В новом API все поддерживаемые учащиеся, включая AdaDelta, AdaGrad, FSAdaGrad, Адам, MomentumSGD, Nesterov, RMSProp и AND, теперь можно указать с помощью

cntk.<cntk_supporting_learner>(parameters=model.parametes,
    lr=<float or list>,
    [momentum=<float or list>], [variance_momentum=<float or list>],
    minibatch_size=<None, int, or cntk.learners.IGNORE>,
    ...other learner parameters)

Есть два основных изменения:

  • lr: расписание скорости обучения можно указать как число с плавающей запятой, список с плавающей запятой или список пар (float, int) (см. определение параметра в learning_parameter_schedule). Та же спецификация применяется к импульсу и variance_moment учащихся, FSAdaGrad, Адам, MomentumSGD, Nesterov, где требуются такие гиперпараметров.

  • minibatch_size: minibatch_size можно указать, чтобы гарантировать, что средний градиент каждого образца N (minibatch_size=N) способствует обновлению модели с той же скоростью обучения, даже если фактический размер мини-батта для данных отличается от N. Это полезно, если размер мини-пакета данных изменяется, особенно в сценариях обучения с последовательностями переменной длины и (или) неравномерной секцией данных в распределенном обучении.

    • Если задано minibatch_size=cntk.learners.IGNORE, то мы восстанавливаем поведение в литературе: средний градиент всего минибата способствует обновлению модели с той же скоростью обучения. Поведение игнорирования размера данных minibatch данных аналогично указанию размера мини-пакета для учащегося, если размер мини-пакета данных равен указанному размеру мини-пакета.

С помощью нового API:

  • Чтобы обновить модель так же, как и в классической литературе глубокого обучения, можно указать учащегося, задав параметр minibatch_size=cntk.learners.IGNORE игнорировать размер мини-бата, например.
sgd_learner_m = C.sgd(z.parameters, lr = 0.5, minibatch_size = C.learners.IGNORE)

Примечание

  • Чтобы включить CNTK определенные методы, которые применяют одну и ту же скорость обучения к среднему градиенту каждого N-выборки независимо от фактических размеров мини-батов, мы можем указать учащегося, установив , например, параметр minibatch_size=Nminibatch_size=2,
sgd_learner_s2 = C.sgd(z.parameters, lr = 0.5, minibatch_size = 2)

Что касается momentum_schedule учащихся FSAdaGrad, Адама, MomentumSGD и Nesterov, его можно указать аналогичным образом. Рассмотрим momentum_sgd пример:

momentum_sgd(parameters, lr=float or list of floats, momentum=float or list of floats,
             minibatch_size=C.learners.IGNORE, epoch_size=epoch_size)
momentum_sgd(parameters, lr=float or list of floats, momentum=float or list of floats,
             minibatch_size=N, epoch_size=epoch_size)

Как и в случае learning_rate_scheduleс аргументами, аргументы интерпретируются так же:

  • При этом minibatch_size=C.learners.IGNOREразложение momentum=beta применяется к среднему градиенту всего минибатча независимо от его размера. Например, независимо от размера минибатча n или 2N (или любого размера), средний градиент такого минибатча будет иметь тот же коэффициент распада бета-версии.

  • При этом minibatch_size=Nразложение momentum=beta применяется к среднему градиенту каждого N образцов. Например, минибатаки размеров N, 2N, 3N и kN будут иметь распада бета, pow(бета, 2), pow(beta, 3) и pow(beta, k) соответственно --- разложение экспоненциально в пропорции фактического размера мини-боя до указанного размера мини-боя.

API C#/.NET, позволяющий пользователям создавать и обучать сети.

Поддержка обучения добавляется в API C#/.NET.

В дополнение к существующему API оценки CNTK C#, .NET разработчики могут наслаждаться полностью интегрированным интерфейсом глубокого обучения. Глубокая нейронная сеть может быть создана, обучена и проверена полностью в C#, а также воспользоваться преимуществами CNTK производительности. Пользователи могут выполнять отладку непосредственно в CNTK исходном коде, чтобы узнать, как выполняется обучение и оценка DNN. Новые функции:

Базовый API обучения C#.

Для создания вычислительной сети поддерживаются более 100 базовых функций. Эти функции включают Sigmoid, Tanh, ReLU, Plus, Минус, Convolution, Pooling, BatchNormalization, чтобы назвать несколько.

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

Function z = CNTKLib.Times(weightParam, input) + biasParam;
Function loss = CNTKLib.CrossEntropyWithSoftmax(z, labelVariable);
CNTK функцию в качестве примитивного элемента для создания DNN

DNN создается с помощью базовой композиции операций. Например, чтобы создать узел ResNet, выполните приведенные ниже действия.

Function conv = CNTKLib.Pooling(CNTKLib.Convolution(convParam, input),
                                PoolingType.Average, poolingWindowShape);
Function resNetNode = CNTKLib.ReLU(CNTKLib.Plus(conv, input));
Поддержка пакетной обработки

Мы предоставляем служебные программы MinibatchSource и MinibacthData для эффективной загрузки и пакетной обработки данных.

Поддержка обучения

Мы поддерживаем многие оптимизаторы градиентного градиента, часто встречающиеся в литературе DNN: MomentumSGDLearner, AdamLearner, AdaGradLearner и т. д. Например, чтобы обучить модель с помощью оптимизатора ADAM Stochastic:

var parameterLearners = new List<Learner>() { Learner.AdamLearner(classifierOutput.Parameters(),
                                                                  learningRate, momentum) };
var trainer = Trainer.CreateTrainer(classifierOutput, trainingLoss,
                                    prediction, parameterLearners);

Примеры обучения охватывают широкий спектр вариантов использования DNN:

Привязка R для CNTK

Привязка R для CNTK, которая обеспечивает как обучение, так и оценку, будет опубликована в отдельном репозитории в ближайшее время.

Примеры

Обнаружение объектов с помощью Fast R-CNN и Fast R-CNN

Новые примеры Eval на C++

Мы добавили новые примеры CNTKLibraryCPPEvalCPUOnlyExamples C++ и CNTKLibraryCPPEvalGPUExamples. Они иллюстрируют использование библиотеки CNTK C++ для оценки модели на ЦП и GPU. Еще одним новым примером является UWPImageRecognition, который является примером использования библиотеки UWP CNTK для оценки модели.

Новые примеры C# Eval

Мы добавили пример для асинхронной оценки: EvaluationSingleImageAsync(). Одно, что мы должны отметить, CNTK C# API не имеет асинхронного метода для Evaluate(), так как вычисление является операцией, привязанной к ЦП (см. эту статью для подробного объяснения). Однако в некоторых случаях требуется выполнить оценку асинхронно, например разгрузку для реагирования, мы покажем, EvaluationSingleImageAsync() как добиться этого с помощью метода EvaluateAsync()расширения. Дополнительные сведения см. в разделе "Асинхронное выполнение оценки" на странице "Использование C#/.NET Управляемого API".

Operations

Узел оценки контрастности шума

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

Чтобы использовать его, определите потерю следующим образом:

loss = nce_loss(weights, biases, inputs, labels, noise_distribution)

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

logits = C.times(weights, C.reshape(inputs, (1,), 1)) + biases

Обратите внимание, что потеря оценки контрастности шума не может помочь с сокращением затрат на вывод; экономия затрат только во время обучения.

Улучшенная модель внимания

Исправлена ошибка в слое AttentionModel, и теперь мы верно реализуем документ

Нейронный машинный перевод совместно Обучение для выравнивания и перевода (Bahdanau et. al.)

Кроме того, аргументы attention_span и attention_axis объект AttentionModel устарели. Они должны быть оставлены на значения по умолчанию, в этом случае внимание вычисляется по всей последовательности, а выходные данные — последовательность векторов того же измерения, что и первый аргумент по оси второго аргумента. Это также приводит к значительному повышению скорости (наше CNTK учебник 204 теперь работает более чем на 2x быстрее).

Агрегирование на разреженном градиенте для внедренного слоя

Это изменение экономит преобразование из разреженных в плотный, прежде чем агрегирование градиента при внедрении размера словаря огромный. В настоящее время она включена для сборки GPU при обучении на GPU с неквантизированными данными parallel JSON. Для других распределенных учащихся и сборки ЦП она отключена по умолчанию. Его можно отключить вручную в Python путем вызова cntk.cntk_py.use_sparse_gradient_aggregation_in_data_parallel_sgd(False). Обратите внимание, что в редких случаях при выполнении распределенного обучения с устройством ЦП в сборке GPU необходимо вручную отключить его, чтобы избежать неисправного исключения.

Снижение ранга для свертки в C++ для включения свертки для 1D-данных

Теперь convolution и convolution_transpose поддержка данных без измерения канала или глубины путем установки значения reductionRank 0 вместо 1. Мотивация этого изменения заключается в добавлении возможности собственной поддержки геометрических данных без необходимости вставлять фиктивное измерение канала путем изменения формы.

Дилатированные свертки (только GPU)

Мы добавили поддержку свертки диляций на GPU, предоставляемых API BrainScript, C++ и Python. Свертка диляций фактически увеличивает размер ядра, фактически не требуя большого ядра. Чтобы использовать свертку диляций, вам потребуется по крайней мере cuDNN 6.0. Дилатированное свертывание улучшило результат сегментации изображения в https://arxiv.org/pdf/1511.07122.pdf, кроме того, оно экспоненциально увеличивает восприимчивое поле без увеличения требуемой памяти. Следует отметить, что в настоящее время нет реализации дилатированного свертки на ЦП, поэтому вы не можете оценить модель, содержащую дилатированную свертку на ЦП.

Бесплатная поддержка статических осей для свертки

  • Мы добавили поддержку бесплатных статических осей FreeDimension для свертки. Это позволяет изменить размер тензора ввода с minibatch на minibatch. Например, если имена CNN позволяют каждому мини-пакету иметь другой базовый размер изображения. Аналогичная поддержка также включена для узла пула.
  • Обратите внимание, что быстрый пример R-CNN для обнаружения объектов пока не использует поддержку свободных статических осей для свертки (т. е. по-прежнему масштабируется и заполняет входные изображения фиксированного размера). Этот пример обновляется для использования свободных статических осей для произвольных размеров входных изображений и предназначен для следующего выпуска.

Детерминированное объединение

Теперь вызов cntk.debug.force_deterministic() сделает детерминированное максимальное и среднее пулы, это поведение зависит от cuDNN версии 6 или более поздней.

Добавление узла обрезки в API Python

Мотивация для поддержки некоторой сети сегментации изображений добавлена в C++ и API Python. Обрезка узла обрезает свои первые входные данные вдоль пространственных осей, чтобы результат соответствовал пространственному размеру второго (ссылочного) входного значения. Все непространственные измерения не изменяются. Смещение обрезки можно указать напрямую или вычислить автоматически путем обхода сети и соответствующих центров восприимчивых полей между активациями в двух входных данных.

Производительность

Обновление Intel MKL для повышения скорости вывода на ЦП примерно на 2x в AlexNet

Эта работа развертывается до следующего выпуска из-за зависимости от обновлений тестовой инфраструктуры.

Keras и Tensorboard

Поддержка нескольких GPU для Keras на CNTK.

Мы добавили статью о том, как проводить параллельную подготовку по CNTK с Keras. Подробные сведения см. здесь.

Поддержка изображений Tensorboard для CNTK.

Мы добавили поддержку функций изображений для TensorBoard. Теперь CNTK пользователи могут использовать TensorBoard для отображения изображений. Дополнительные сведения и примеры можно найти здесь.

Благодарности

Мы благодарим следующих членов сообщества за их вклад:+

Мы извиняемся за любые вклады сообщества, которые мы могли бы упускать из виду в этих заметках о выпуске.

Другие

Продолжайте работу над курсом Deep Обучение Explained на edX.