Nó tương đối đơn giản. Theo các giả định đơn giản mà bạn yêu cầu một quy trình cho mỗi máy chủ, slurm sẽ cung cấp cho bạn tất cả thông tin bạn cần trong các biến môi trường, cụ thể là SLURM_PROCID, SLURM_NPROCS và SLURM_NODELIST.
Ví dụ, bạn có thể khởi tạo index nhiệm vụ của bạn, số lượng các nhiệm vụ và các NodeList như sau:
from hostlist import expand_hostlist
task_index = int(os.environ['SLURM_PROCID'])
n_tasks = int(os.environ['SLURM_NPROCS'])
tf_hostlist = [ ("%s:22222" % host) for host in
expand_hostlist(os.environ['SLURM_NODELIST']) ]
Lưu ý rằng slurm cung cấp cho bạn một danh sách máy chủ ở định dạng nén của nó (ví dụ, "myhost [11 -99] "), mà bạn cần mở rộng. Tôi làm điều đó với module hostlist bởi Kent Engström, có sẵn ở đây https://pypi.python.org/pypi/python-hostlist
Vào thời điểm đó, bạn có thể đi ngay phía trước và tạo ra đặc điểm kỹ thuật cụm TensorFlow và máy chủ của bạn với thông tin mà bạn đã có sẵn, ví dụ:
cluster = tf.train.ClusterSpec({"your_taskname" : tf_hostlist })
server = tf.train.Server(cluster.as_cluster_def(),
job_name = "your_taskname",
task_index = task_index)
Và bạn đã sẵn sàng! Bây giờ bạn có thể thực hiện vị trí nút TensorFlow trên một máy chủ cụ thể giao của bạn với cú pháp thông thường:
for idx in range(n_tasks):
with tf.device("/job:your_taskname/task:%d" % idx):
...
Một lỗ hổng với mã thông báo ở trên là tất cả các công việc của bạn sẽ hướng dẫn Tensorflow để cài đặt các máy chủ nghe tại 22.222 cổng cố định. Nếu nhiều công việc như vậy xảy ra được lên lịch cho cùng một nút, lệnh thứ hai sẽ không nghe được 22222.
Một giải pháp tốt hơn là để cho các cổng dự trữ slurm cho mỗi công việc. Bạn cần phải đưa quản trị viên slurm của bạn lên tàu và yêu cầu anh ta cấu hình slurm để nó cho phép bạn yêu cầu các cổng với tùy chọn --resv-ports. Trên thực tế, điều này đòi hỏi yêu cầu họ thêm một dòng như sau trong slurm.conf của họ:
MpiParams=ports=15000-19999
Trước khi bạn lỗi quản trị slurm, hãy kiểm tra những tùy chọn đã được cấu hình, ví dụ, với:
scontrol show config | grep MpiParams
Nếu trang web của bạn đã sử dụng phiên bản cũ của OpenMPI, có khả năng một tùy chọn như thế này đã có sẵn.
Sau đó, sửa đổi đoạn đầu tiên của tôi về mã như sau:
from hostlist import expand_hostlist
task_index = int(os.environ['SLURM_PROCID'])
n_tasks = int(os.environ['SLURM_NPROCS'])
port = int(os.environ['SLURM_STEP_RESV_PORTS'].split('-')[0])
tf_hostlist = [ ("%s:%s" % (host,port)) for host in
expand_hostlist(os.environ['SLURM_NODELIST']) ]
Chúc may mắn!
Thông báo thông tin trên [site tích hợp liên tục] (http://ci.tensorflow.org/) có thể giúp đỡ. Ngoài ra, hãy xem [readme] (https://tensorflow.googlesource.com/tensorflow/+/master/tensorflow/tools/ci_build/README.md) –
Tôi đã chạy truy vấn Google của Slurm và Docker và có nhiều kết quả. –
Bạn có tìm thấy các nguồn cụ thể không? Nếu có, hãy chia sẻ chúng. Tất nhiên Google liệt kê một số trang nhưng tôi không thể tìm thấy bất kỳ lời khuyên, hướng dẫn hoặc thông tin chính thức về việc chạy TensorFlow với Python-API của nó thông qua một công việc Slurm. – daniel451