2016-01-16 21 views
12

Tôi có thể truy cập vào cụm máy tính, cụ thể là một nút có hai CPU 12 lõi, đang chạy với Slurm Workload Manager.Chạy TensorFlow trên một cụm Slurm?

Tôi muốn chạy TensorFlow trên hệ thống đó nhưng tiếc là tôi không thể tìm thấy bất kỳ thông tin nào về cách thực hiện việc này hoặc nếu điều này thậm chí có thể. Tôi mới đến điều này nhưng theo như tôi hiểu nó, tôi sẽ phải chạy TensorFlow bằng cách tạo ra một công việc Slurm và không thể trực tiếp thực hiện python/tensorflow thông qua ssh.

Có ai là ý tưởng, hướng dẫn hoặc bất kỳ loại nguồn nào về chủ đề này không?

+1

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) –

+0

Tôi đã chạy truy vấn Google của Slurm và Docker và có nhiều kết quả. –

+1

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

Trả lời

19

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!

2

Bạn chỉ có thể vượt qua một kịch bản hàng loạt để slurm với lệnh sbatch như vậy

sbatch --partition=part start.sh 

danh sách các phân vùng có sẵn có thể được thực hiện với sinfo.

start.sh (có thể cấu hình) :

#!/bin/sh 
#SBATCH -N 1  # nodes requested 
#SBATCH -n 1  # tasks requested 
#SBATCH -c 10  # cores requested 
#SBATCH --mem=32000 # memory in Mb 
#SBATCH -o outfile # send stdout to outfile 
#SBATCH -e errfile # send stderr to errfile 
python run.py 

trong khi run.py chứa các kịch bản bạn muốn được thực hiện với slurm ví dụ đang tensorflow của bạn.

Bạn có thể tra cứu thông tin chi tiết ở đây: https://slurm.schedmd.com/sbatch.html

Các vấn đề liên quan