Как сравнить бета-версию USB Accelerator с помощью Google? - PullRequest
0 голосов
/ 17 июня 2019

Я хочу сравнить бета-версию USB Accelerator от Google с помощью функции time.time () Python.

Я начал с установки библиотеки времени выполнения Edge TPU. Я нашел процедуру на Google .

Затем я последовал методу, чтобы выполнить вывод с классификацией нейронной сети. Я выполняю следующие команды:

     cd /usr/local/lib/python3.5/dist-packages/edgetpu/demo

    python3 classify_image.py \
    --model ~/Downloads    /mobilenet_v2_1.0_224_inat_bird_quant_edgetpu.tflite \
--label ~/Downloads/inat_bird_labels.txt \
--image ~/Downloads/parrot.jpg    

Теперь я хочу протестировать этот пример, поэтому я пошел к classify_image.py и реализовал функцию time.time () библиотеки Python для измерения времени выполнения нейрона.

Вот изменения, которые я сделал:

   def main():
      parser = argparse.ArgumentParser()
      parser.add_argument(
      '--model', help='File path of Tflite model.', required=True)
      parser.add_argument(
      '--label', help='File path of label file.', required=True)
      parser.add_argument(
      '--image', help='File path of the image to be recognized.', required=True)
      args = parser.parse_args()
      print ("[ INFO ] Loading network files:")
      print(args.model)
      print ("[ INFO ] Loading image file:")
      print(args.image)
      print ("[ INFO ] Starting inference (5 iterations)")
      print ("[ INFO ] Loading label file:")
      print (args.label)
      # Prepare labels.
      labels = ReadLabelFile(args.label)
      temps=0.0
      print("[ INFO ] stard profiling")
      print(".................................................")
      for i in range(4):
          # Initialize engine.
          engine = ClassificationEngine(args.model)
          # Run inference.
          print("[ INFO ] Loading image in the model")
          t1=time.time()           
          img = Image.open(args.image)
          result=engine.ClassifyWithImage(img, threshold=0.1, top_k=5, resample=0)
          t2=time.time()
          temps=temps+(t2-t1)

      print("[ INFO ] end profiling")
      print(".................................................")
      print("total inference time {} s:".format(temps))  
      print("Average running time of one iteration {} s:".format(temps/5.0)) 
      print("Throughput: {} FPS".format(5.0/temps*1.0))

Результат - «Среднее время выполнения одной итерации 0,41750078201293944 с».

[ INFO ] Loading network files:
inception_v1_224_quant.tflite
[ INFO ] Loading image file:
/cat_W_3000_H_2000.jpg
[ INFO ] Starting inference (5 iterations)
[ INFO ] Loading label file:
/imagenet_labels.txt
[ INFO ] stard profiling
.................................................
[ INFO ] end profiling
.................................................
total inference time 2.0875039100646973 s:
Average running time of one iteration 0.41750078201293944 s:
Throughput: 2.3952050944158647 FPS

Когда я захотел проверить, верны ли мои результаты, я пошел по этой ссылке Google (официальный сайт USB Accelerator coarl beta от Google) и обнаружил, что для нейронной сети inception_v1 (224 * 224) они измеряют 3,6 мс, а я измеряю 417 мс.

Итак, мой вопрос: как я могу правильно оценить бета-версию USB Accelerator coarl от Google?

Ответы [ 2 ]

0 голосов
/ 25 июня 2019

Данные о времени ожидания, указанные на веб-сайте Google, представляют собой время вывода, за исключением времени подготовки изображения.Python API возвращает задержку логического вывода как часть результатов, как описано здесь .Чтобы измерить время стены, вы можете время начала и конца вывода.Вы также должны отключить масштабирование процессора перед сравнительным тестированием. get_inference_time () возвращает время вывода, которое измеряется в миллисекундах.

0 голосов
/ 23 июня 2019

Есть две проблемы. Во-первых, чтобы получить «правильные» результаты тестов, вам нужно запустить несколько раз (а не один). Зачем? Обычно для подготовки рабочей среды требуется некоторое дополнительное время, и между запусками могут быть расхождения. Во-вторых, engine.ClassifyWithImage включает время обработки изображения (масштабирование и обрезка входного изображения). Таким образом, «правильный способ» сделать это (1) добавить несколько прогонов прогона и запустить несколько раз, и (2) использовать ClassificationEngine вместо ClassifyWithImage. На самом деле, я сделал это около двух месяцев назад и поместил свой код на github, см. Мои скрипты здесь .

...