Рубрики
Без рубрики

Стресс-тестирование неборочный трубопровод

Я работал над вызовом для проекта кода, называется неровным. Я написал ряд постов на ней … С меткой Python, безверенно.

Я работал над вызовом для проекта кода, называется неровным. Я написал ряд постов здесь про IBM Cloud Functions, которые используются для большей части трубопровода Render. Несколько недель назад мы сделали «альфа» выпуску небезопасных Отказ

С тех пор у нас было ряд людей, связанных с нами по поводу использования небессией. От парикмахерских хоров до марширования групп. В более широком конце масштаба марширующие полосы имеют около 100-120 музыкантов, выполняющих одновременно.

Может ли не любить, что многие? Ну … мы, безусловно, хотим, но из интереса можно было бы «альфа-версию», которую мы собрали вместе в последние 8 недель справиться с ней? Я решил попробовать!

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

Текущие этапы обработки трубопроводов являются:

  1. Преобразовать файл RAW видео в стандартный формат, уменьшить размер, нормализовать звуковую громкость
  2. Рассчитайте выравнивание со ссылкой аудио трека
  3. Обрежьте аудио/видео на основе расчета выравнивания
  4. Сшить все видео вместе, чтобы произвести окончательное видео
  5. Сделать снимок JPG видео

Мой коллега, Шон, вытащил свои башники и записал 6 представлений определенного музыкального произведения. Это было то, как это вышло на неберее, чтобы начать с:

Итак, чтобы стресс-тестировать трубопровод с рендерингом, мне нужно было реплицировать видео Sean несколько раз. Поэтому я создаю новую облачную функцию под названием «Wateraftermidnightgine» (вы можете догадаться на ссылку?). Эта функция без сервеса подсчитала, сколько кусков «Гремлин» есть в ведре COS:

    choir_id = args['choir_id']
    song_id = args['song_id']
    num_gremlins = int(args['num_gremlins'])

    bucket = "choirless-videos-converted"
    prefix_key = f"{choir_id}+{song_id}"

    # list all objects in the COS bucket
    contents = cos.list_objects(
        Bucket=bucket,
        Prefix=prefix_key
    )

    # Just get the "keys" (filenames)
    files = [ x['Key'] for x in contents['Contents'] ]

    # Find the gremlins and non-gremlins
    gremlins = [ x for x in files if 'gremlin' in x ]
    non_gremlins = [ x for x in files if 'gremlin' not in x ]

    # if we have more gremlins than we need, abort
    if len(gremlins) > num_gremlins:
        args["success"] = "true"
        return args

    # pick a random non_gremlins as the source file   
    source_key = random.choice(non_gremlins)

Итак, на данный момент мы проверили, если у нас достаточно файлов, если так мы прерваны.

Позже в коде мы принимаем исходную часть и применяем случайную задержку с аудио до 50 мс.

       i = len(gremlins) + 1
        new_part = f"gremlin-{i}"
        new_filename = f"{choir_id}+{song_id}+{part_id}-{new_part}{file_path.suffix}"
        new_path = file_path.with_name(new_filename)

        delay = random.randint(0,50)

        stream = ffmpeg.input(str(file_path))
        audio = stream.filter_('adelay', delays=[delay, delay]).filter_('asetpts', 'PTS-STARTPTS')
        video = stream.video
        out = ffmpeg.output(audio, video, str(new_path))
        stdout, stderr = out.run()

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

В конце концов, мы снова называем себя, поэтому эта функция снова пройдет и снова, пока у нас будет достаточно «Гремлинов»

url = "https://eu-gb.functions.appdomain.cloud/api/v1/web/1d0ffa5a-835d-4c40-ac80-77ca4a35f028/choirless/wateraftermidnight.json"

data = {'blocking': False,
        'choir_id': args['choir_id'],
        'song_id': args['song_id'],
        'num_gremlins': args['num_gremlins'],
        'endpoint': args['endpoint'],
        'auth': args['auth'],
        }

headers = {'X-Require-Whisk-Auth': args['auth']}

response = requests.post(url,
                         headers=headers,
                         json=data)

Как это выступило? Ну, по мере увеличения количества деталей, это, безусловно, потребовалось больше времени для обработки. В конце концов мы достигли 10 минут максимального времени обработки для функции IBM Cloud:

2020-07-25 17:48:57 9b844c7035a54743844c7035a5574376 blackbox warm  10m0.1s    developer error 1d0ffa5a-8...a35f028/stitcher:0.0.1
2020-07-25 17:48:46 deb00965e52a4517b00965e52a451702 blackbox warm  8m16.267s  success         1d0ffa5a-8...a35f028/stitcher:0.0.1
2020-07-25 17:48:23 803eebed9a094efbbeebed9a094efb8d blackbox cold  10m0.887s  developer error 1d0ffa5a-8...a35f028/stitcher:0.0.1
2020-07-25 17:48:14 9a3f147606e84495bf147606e8b49567 blackbox cold  10m0.738s  developer error 1d0ffa5a-8...a35f028/stitcher:0.0.1
2020-07-25 17:47:56 b51ddd379e0841a49ddd379e08e1a43b blackbox warm  10m0.1s    developer error 1d0ffa5a-8...a35f028/stitcher:0.0.1
2020-07-25 17:47:37 2360edede1bf4c81a0edede1bfcc81f9 blackbox warm  10m0.1s    developer error 1d0ffa5a-8...a35f028/stitcher:0.0.1
2020-07-25 17:47:08 51d0a0c7a58c4a8c90a0c7a58c7a8c97 blackbox cold  10m0.9s    developer error 1d0ffa5a-8...a35f028/stitcher:0.0.1
2020-07-25 17:45:56 87e813b70ed0489ba813b70ed0a89b33 blackbox cold  10m0.654s  developer error 1d0ffa5a-8...a35f028/stitcher:0.0.1
2020-07-25 17:45:49 cd6ecfbfc80b468aaecfbfc80b968a76 blackbox cold  5m48.593s  success         1d0ffa5a-8...a35f028/stitcher:0.0.1
2020-07-25 17:45:47 579fe9bf797e4d799fe9bf797ecd7990 blackbox cold  10m0.758s  developer error 1d0ffa5a-8...a35f028/stitcher:0.0.1
2020-07-25 17:45:29 0590fda27cb041a490fda27cb061a489 blackbox cold  5m37.71s   success         1d0ffa5a-8...a35f028/stitcher:0.0.1
2020-07-25 17:44:35 8b00060e460d40f480060e460db0f446 blackbox cold  10m0.588s  developer error 1d0ffa5a-8...a35f028/stitcher:0.0.1
2020-07-25 17:42:59 2fdfd1b0f6684d629fd1b0f668bd6255 blackbox cold  5m47.901s  success         1d0ffa5a-8...a35f028/stitcher:0.0.1
2020-07-25 17:42:48 397d601be46843eebd601be468f3ee10 blackbox warm  5m39.129s  success         1d0ffa5a-8...a35f028/stitcher:0.0.1
2020-07-25 17:42:22 fdaec354afa848faaec354afa828fa6e blackbox warm  7m30.957s  success         1d0ffa5a-8...a35f028/stitcher:0.0.1
2020-07-25 17:42:13 bdcb0526692047468b052669204746ac blackbox warm  8m22.11s   success         1d0ffa5a-8...a35f028/stitcher:0.0.1

Первоначально шаг 1. Выше в нашем трубопроводе снижал наши входные видеофайлы до максимальной ширины 640px. Но если у нас есть 120 видео на экране, то окончательное видео будет крошечно. Поэтому я написал скрипт, чтобы уменьшить их все дальше до 160 пикселей каждый. И повторно пробежал эксперимент:

% ic fn action invoke choirless/wateraftermidnight --param choir_id 001jr0nG1EKeJr2W13rs3ZIZi42mi3fO --param song_id 001jxwlK1NkxRI0Y7T3S1jUSHW2Ndy5D --param num_gremlins 120

Он все еще был рядом с лимитом 10 м, но в удалении пройти, с финальным пробегом 7M37S:

2020-07-25 20:33:31 7f8a96c60f544dd28a96c60f540dd217 blackbox cold  7m37.326s  success         1d0ffa5a-8...a35f028/stitcher:0.0.1
2020-07-25 19:49:31 89326734e14d4dacb26734e14d7dacbf blackbox cold  8m46.551s  success         1d0ffa5a-8...a35f028/stitcher:0.0.1
2020-07-25 19:49:30 d779c856e14a4836b9c856e14a083602 blackbox cold  10m0.612s  developer error 1d0ffa5a-8...a35f028/stitcher:0.0.1
2020-07-25 19:49:24 62f3899173ee4a7db3899173ee6a7de7 blackbox cold  10m0.922s  developer error 1d0ffa5a-8...a35f028/stitcher:0.0.1
2020-07-25 19:49:12 fc7a69b025614514ba69b02561c5147c blackbox cold  10m0.725s  developer error 1d0ffa5a-8...a35f028/stitcher:0.0.1
2020-07-25 19:49:06 d5981e250aca4d75981e250aca0d75f3 blackbox cold  10m0.547s  developer error 1d0ffa5a-8...a35f028/stitcher:0.0.1
2020-07-25 19:49:05 adf6fc4789d746bbb6fc4789d7d6bbd4 blackbox cold  10m0.58s   developer error 1d0ffa5a-8...a35f028/stitcher:0.0.1
2020-07-25 19:49:04 f16bbd2d6f754109abbd2d6f75410992 blackbox cold  8m27.366s  success         1d0ffa5a-8...a35f028/stitcher:0.0.1
2020-07-25 19:49:04 4481728f79b246e281728f79b206e25f blackbox cold  8m39.499s  success         1d0ffa5a-8...a35f028/stitcher:0.0.1
2020-07-25 19:49:01 1e4f7485d9364bfc8f7485d936abfc27 blackbox warm  7m50.131s  success         1d0ffa5a-8...a35f028/stitcher:0.0.1
2020-07-25 19:48:54 79a5603cd3744b05a5603cd3742b0599 blackbox warm  9m39.024s  success         1d0ffa5a-8...a35f028/stitcher:0.0.1
2020-07-25 19:48:52 1d6c6d0a42ff4661ac6d0a42ffa661b7 blackbox cold  7m32.764s  success         1d0ffa5a-8...a35f028/stitcher:0.0.1
2020-07-25 19:48:52 02b087103f444b56b087103f44fb567f blackbox cold  7m24.082s  success         1d0ffa5a-8...a35f028/stitcher:0.0.1
2020-07-25 19:48:49 17f4fdea027148f2b4fdea027188f27b blackbox warm  10m0.102s  developer error 1d0ffa5a-8...a35f028/stitcher:0.0.1
2020-07-25 19:48:48 9258a88f95864ddd98a88f95860dddda blackbox cold  9m54.567s  success         1d0ffa5a-8...a35f028/stitcher:0.0.1
2020-07-25 19:48:46 d38d78db20ee48e38d78db20eea8e31e blackbox cold  7m34.876s  success         1d0ffa5a-8...a35f028/stitcher:0.0.1

И как это вышло? Довольно удивительно!

Я ожидал, что это не удастся из-за выхода из TEMP дискового пространства или дескрипторов файлов или памяти … Но он работает под 2 ГБ ОЗУ.

Это очень многообещающе. Мы уже планируем переписывание конвейера рендеринга, чтобы разбить его на этапы немного больше. И часть, которая фактически образует команду FFMPEG для запуска, в настоящее время в Node.js будет переписан в Python и сделает более модульные, поэтому мы можем добавить дополнительную функциональность (регулировка отдельных частей, вручную настроить панорамирование и т. Д.)

Оригинал: “https://dev.to/hammertoe/stress-testing-choirless-render-pipeline-3bc”