Модель TFLite переполняется на GPU, хорошо на CPU. В чем отличия внутри? - PullRequest
1 голос
/ 27 мая 2020

На Android у меня есть модель, которая отлично работает на ЦП, но переполняется при переключении на делегат ГП («Бесконечность» в результатах). Если я изменю масштаб ввода, я могу устранить переполнение, поэтому это кажется проблемой разного внутреннего диапазона / точности между ЦП и ГП. У меня создалось впечатление, что и ЦП, и ГП по умолчанию используют 32-битное число с плавающей запятой, поэтому результаты должны быть идентичными. Кто-нибудь знает внутреннее устройство TFLite достаточно, чтобы дать некоторое представление?

1 Ответ

1 голос
/ 29 мая 2020

Что касается точности с плавающей запятой, делегат TFLite GPU на Android может работать в двух режимах, которые вы можете выбрать с помощью следующего метода в классе Options. (скопировано из здесь )

    /**
     * Sets whether precision loss is allowed.
     *
     * @param precisionLossAllowed When `true` (default), the GPU may quantify tensors, downcast
     *     values, process in FP16. When `false`, computations are carried out in 32-bit floating
     *     point.
     */
    public Options setPrecisionLossAllowed(boolean precisionLossAllowed) {
      this.precisionLossAllowed = precisionLossAllowed;
      return this;
    }

Поскольку значение по умолчанию для этой опции precisionLossAllowed - true, ваша модель будет работать в режиме FP16 при использовании графического процессора по умолчанию. Если вы хотите принудительно запустить режим FP32, как в CPU, вы должны явно установить для этого параметра значение false при создании делегата.

GpuDelegate.Options gpuOptions = new GpuDelegate.Options();
gpuOptions.setPrecisionLossAllowed(false);
GpuDelegate gpuDelegate = new GpuDelegate(gpuOptions);

Interpreter.Options interpreterOptions = new Interpreter.Options();
interpreterOptions.addDelegate(gpuDelegate);
Interpreter interpreter = new Interpreter(tflite_model_file, interpreterOptions);

Это должно дать вам тот же результат, что и в режиме CPU, но приводит к более медленному выполнению по сравнению с режимом FP16.

...