在AWS spot实例上运行一批作业



我有一批python作业,它们只在读取的输入文件上有所不同,比如:

python main.py --input=file1.json > log_file1.txt
python main.py --input=file2.json > log_file2.txt
python main.py --input=file3.json > log_file3.txt
...

所有这些作业都是独立的,并且使用预先构建的anaconda环境。

我能够使用以下工作流在按需EC2实例上运行我的代码:

  • 使用输入文件和预构建的conda环境装载EBS卷
  • 激活conda环境
  • 运行python程序,使每个程序读取不同的输入文件,并写入单独的日志文件。输入文件存储在EBS卷中,日志文件将写入EBS卷

现在,我想将其扩展为使用AWS点实例——基本上,如果我有N个作业,请请求运行上述作业之一的N个点实例,每个实例从现有卷读取不同的文件,并将输出写入同一卷上的不同文件。但我找不到一份关于如何做这件事的全面指南。任何帮助都将不胜感激。

也许这会给你一些思考的东西,因为我的解决方案与你的不完全一样,但现在开始。(哦,我也要看看批次,只是还没到那里(。我有相当大的股票期权文件,我分析和转换500个不同的符号。我使用了一些工具来计算我对最大文件的内存需求,最大大约是4MB。我从ec2和ebs存储的映像中提取了一个至少有30MB的点实例,所以它总是和我测试的一样,只是内存更多。

我运行了一个shell脚本,将大约500个符号分解为6-10个不同的块,并在一台机器上同时运行它们。我对时间不敏感,所以我并不需要多台机器并行运行。但我可以,我只是运行一个不同的脚本。

这是脚本:

for y in {0..500..50}
do
start_slice=$(($y))
end_slice=$(($y + 50))
#   echo $low_limit
#    echo $high_limit
/usr/local/bin/pipenv run ~/.local/share/virtualenvs/ec2-user-zzkNbF-x/bin/python /home/ec2-user/code/etrade_getoptionsdata/get_bidask_of_baseline_combos_intraday_parallel.py -s $start_slice -e $end_slice &
# echo 'next file'
done

我的环境是pipenv,并放入环境路径,这样它就可以访问我的所有模块同样,脚本只是将相同的分析分解为每个 50个符号

在我的文件中,我使用了一个for循环,该循环使用传入的参数-s和-e对于keys_list[s:e]中的key_cons

为了启动我一直在和nohup玩的shell脚本/shell.sh$,所以它在后台运行,当我的ssh会话结束时不会停止。

如果每个作业需要一个实例,那么这就是需要的。我运行的每个单独的转换需要30-45秒,所以它仍然需要几个小时。

如果你有任何问题,请告诉我。

最新更新