В dask, какой самый простой способ запустить задачу, которая сама запускает контейнер docker? - PullRequest
1 голос
/ 04 марта 2020

Следующий код отображает функцию на итерацию. Функция, применяемая к каждому элементу, запускает контейнер docker для вычисления его возвращаемого значения:

import subprocess

def task(arg):
    return subprocess.check_output(
        ["docker", "run", "ubuntu", "bash", "-c", f"echo 'result_{arg}'"]
    )

args = [1, 2, 3]
for result in map(task, args):
    print(result.decode("utf-8").strip())
result_1
result_2
result_3

Какой самый простой способ распараллелить это вычисление с ресурсами облачных вычислений в dask?

Например, было бы хорошо, если бы можно было сделать что-то вроде следующего. Но это, конечно, не работает, потому что контейнеры docker в Fargate, в которых выполняется код python, запускают образ dask по умолчанию и, следовательно, не имеют возможности порождать контейнер docker сами (я не уверен, есть ли решение в этом направлении "docker -in- docker" или нет):

import subprocess

from dask.distributed import Client
from dask_cloudprovider import FargateCluster
import dask.bag

def task(arg):
    return subprocess.check_output(
        ["docker", "run", "ubuntu", "bash", "-c", f"echo 'result_{arg}'"]
    )

cluster = FargateCluster(n_workers=1)
client = Client(cluster)
args = [1, 2, 3]
for result in dask.bag.from_sequence(args).map(task).compute():
    print(result)

Я ищу решение, которое не включает размещение несвязанного кода в то же самое docker изображение. Т.е. я хочу, чтобы изображение docker, используемое моей задачей для его вычисления, было произвольным изображением третьей стороны, которое мне не нужно изменять путем добавления зависимостей python / dask. Поэтому я думаю, что это исключает решения, основанные на изменении образа, используемого рабочим узлом в dask_cloudprovider.FargateCluster/ECSCluster, поскольку в нем должны быть размещены зависимости python / dask.

1 Ответ

1 голос
/ 06 апреля 2020

Перенос контейнера на узел kubernetes приводит к значительным накладным расходам и может быть оправдан только в том случае, если задача выполняется долго (минуты, часы). dask ориентирован на задачи с низкой нагрузкой python.

На мой взгляд, dask не является правильным инструментом для выполнения задач, которые представляют собой изображения-контейнеры. Существует несколько других технологий, которые лучше поддерживают выполнение задач / рабочих процессов на основе контейнеров (например, Airflow's KubernetesExecutor или Ar go Workflows).

Что вы могли бы рассмотреть, это использовать dask_kubernetes внутри задачи на основе контейнера для вращения эфемерный кластер для выполнения требуемой вычислительной работы.

...