Следующий код отображает функцию на итерацию. Функция, применяемая к каждому элементу, запускает контейнер 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.