Đa GPU trong máy ảnh


33

Làm thế nào để bạn có thể lập trình trong thư viện keras (hoặc tenorflow) để đào tạo phân vùng trên nhiều GPU? Giả sử bạn đang ở trong một phiên bản Amazon ec2 có 8 GPU và bạn muốn sử dụng tất cả chúng để đào tạo nhanh hơn, nhưng mã của bạn chỉ dành cho một CPU hoặc GPU.


3
bạn đã kiểm tra tài liệu tenorflow chưa?
n1tk

@ sb0709: Tôi đã bắt đầu đọc sáng nay nhưng tôi đã tự hỏi làm thế nào để làm điều đó trong máy ảnh
Hector Blandin

1
không biết trong máy ảnh nhưng đối với tenorflow: tf sẽ sử dụng GPU theo mặc định để tính toán ngay cả khi dành cho CPU (nếu có GPU được hỗ trợ). vì vậy bạn chỉ có thể thực hiện một vòng lặp for: "for d in ['/ gpu: 1', '/ gpu: 2', '/ gpu: 3' ... '/ gpu: 8',]:" và trong "tf.device (d)" nên bao gồm tất cả các tài nguyên GPU thể hiện của bạn. Vì vậy, tf.device () sẽ thực sự được sử dụng.
n1tk

Như thế này ?? cho d trong ['/ gpu: 1', '/ gpu: 2', '/ gpu: 3' ... '/ gpu: 8',]: tf.device (d) và đó là? Tôi sẽ cố gắng như vậy :)
Hector Blandin

1
theo tôi biết có, bạn có thể thực hiện bất kỳ nhiệm vụ nào trên các thiết bị khác nhau.
n1tk

Câu trả lời:


37

Từ những câu hỏi thường gặp của Keras:

https://keras.io/getting-started/faq/#how-can-i-run-a-keras-model-on-mult Môn-gpus

Dưới đây là mã được sao chép để kích hoạt 'song song dữ liệu'. Tức là có mỗi GPU của bạn xử lý một tập hợp con dữ liệu khác nhau một cách độc lập.

from keras.utils import multi_gpu_model

# Replicates `model` on 8 GPUs.
# This assumes that your machine has 8 available GPUs.
parallel_model = multi_gpu_model(model, gpus=8)
parallel_model.compile(loss='categorical_crossentropy',
                       optimizer='rmsprop')

# This `fit` call will be distributed on 8 GPUs.
# Since the batch size is 256, each GPU will process 32 samples.
parallel_model.fit(x, y, epochs=20, batch_size=256)

Lưu ý rằng điều này dường như chỉ hợp lệ cho phụ trợ Tensorflow tại thời điểm viết.

Cập nhật (tháng 2 năm 2018) :

Hiện tại, máy ảnh chấp nhận lựa chọn gpu tự động bằng multi_gpu_model, vì vậy bạn không phải mã hóa số lượng gpus nữa. Chi tiết trong Yêu cầu kéo này . Nói cách khác, điều này cho phép mã trông như thế này:

try:
    model = multi_gpu_model(model)
except:
    pass

Nhưng để rõ ràng hơn , bạn có thể gắn bó với một cái gì đó như:

parallel_model = multi_gpu_model(model, gpus=None)

Tiền thưởng :

Để kiểm tra xem bạn có thực sự sử dụng tất cả các GPU của mình hay không, cụ thể là GPU, bạn có thể theo dõi việc sử dụng của mình trong thiết bị đầu cuối bằng cách sử dụng:

watch -n0.5 nvidia-smi

Tài liệu tham khảo:


multi_gpu_model(model, gpus=None)hoạt động trong trường hợp chỉ có 1 GPU không? Sẽ thật tuyệt nếu nó tự động thích ứng với số lượng GPU có sẵn.
CMCDragonkai

Có, tôi nghĩ rằng nó hoạt động với 1 GPU, xem github.com/keras-team/keras/pull/9226#issuecomment-361692460 , nhưng bạn có thể cần phải cẩn thận rằng mã của bạn được điều chỉnh để chạy trên multi_gpu_model thay vì một mô hình đơn giản . Trong hầu hết các trường hợp, điều đó có thể không quan trọng, nhưng nếu bạn định làm gì đó như lấy đầu ra của một số lớp trung gian, thì bạn sẽ cần phải viết mã cho phù hợp.
weiji14

Bạn có bất kỳ tài liệu tham khảo về sự khác biệt mô hình đa gpu?
CMCDragonkai

Ý bạn là một cái gì đó như github.com/rossumai/keras-multi-gpu/blob/master/blog/docs/ ,?
weiji14

Tài liệu tham khảo đó thật tuyệt vời @ weiji14. Tuy nhiên tôi cũng quan tâm đến cách thức hoạt động của suy luận này. Liệu máy ảnh bằng cách nào đó phân chia các lô bằng nhau hoặc lịch trình luân chuyển trên các bản sao mô hình có sẵn?
CMCDragonkai

4
  1. Đối với TensorFlow:

TensorFlow Sử dụng GPU

Dưới đây là mã mẫu về cách sử dụng, do đó, đối với mỗi tác vụ được chỉ định danh sách với các thiết bị / thiết bị:

# Creates a graph.
c = []
for d in ['/gpu:2', '/gpu:3']:
  with tf.device(d):
    a = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[2, 3])
    b = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[3, 2])
    c.append(tf.matmul(a, b))
with tf.device('/cpu:0'):
  sum = tf.add_n(c)
# Creates a session with log_device_placement set to True.
sess = tf.Session(config=tf.ConfigProto(log_device_placement=True))
# Runs the op.
print(sess.run(sum))

tf sẽ sử dụng GPU theo mặc định để tính toán ngay cả khi dành cho CPU (nếu có GPU được hỗ trợ). vì vậy bạn chỉ có thể thực hiện một vòng lặp for: "for d in ['/ gpu: 1', '/ gpu: 2', '/ gpu: 3' ... '/ gpu: 8',]:" và trong "tf.device (d)" nên bao gồm tất cả các tài nguyên GPU thể hiện của bạn. Vì vậy, tf.device () sẽ thực sự được sử dụng.

Đào tạo mô hình máy ảnh nhân rộng cho nhiều GPU

  1. Máy ảnh

Đối với Keras bằng cách sử dụng Mxnet hơn args.num_gpus , trong đó num_gpus là danh sách các GPU cần thiết của bạn.

def backend_agnostic_compile(model, loss, optimizer, metrics, args):
  if keras.backend._backend == 'mxnet':
      gpu_list = ["gpu(%d)" % i for i in range(args.num_gpus)]
      model.compile(loss=loss,
          optimizer=optimizer,
          metrics=metrics, 
          context = gpu_list)
  else:
      if args.num_gpus > 1:
          print("Warning: num_gpus > 1 but not using MxNet backend")
      model.compile(loss=loss,
          optimizer=optimizer,
          metrics=metrics)
  1. horovod.tensorflow

Trên tất cả các Uber mở Horovod gần đây và tôi nghĩ là tuyệt vời:

Horovod

import tensorflow as tf
import horovod.tensorflow as hvd

# Initialize Horovod
hvd.init()

# Pin GPU to be used to process local rank (one GPU per process)
config = tf.ConfigProto()
config.gpu_options.visible_device_list = str(hvd.local_rank())

# Build model…
loss = 
opt = tf.train.AdagradOptimizer(0.01)

# Add Horovod Distributed Optimizer
opt = hvd.DistributedOptimizer(opt)

# Add hook to broadcast variables from rank 0 to all other processes during
# initialization.
hooks = [hvd.BroadcastGlobalVariablesHook(0)]

# Make training operation
train_op = opt.minimize(loss)

# The MonitoredTrainingSession takes care of session initialization,
# restoring from a checkpoint, saving to a checkpoint, and closing when done
# or an error occurs.
with tf.train.MonitoredTrainingSession(checkpoint_dir=“/tmp/train_logs”,
                                      config=config,
                                      hooks=hooks) as mon_sess:
 while not mon_sess.should_stop():
   # Perform synchronous training.
   mon_sess.run(train_op)

2

Về cơ bản, bạn có thể lấy ví dụ về ví dụ sau. Tất cả những gì bạn cần là chỉ định giá trị tiêu thụ cpu và gpu sau khi nhập máy ảnh.

import keras

config = tf.ConfigProto( device_count = {'GPU': 1 , 'CPU': 56} )
sess = tf.Session(config=config) 
keras.backend.set_session(sess)

Sau đó, bạn sẽ phù hợp với mô hình.

model.fit(x_train, y_train, epochs=epochs, validation_data=(x_test, y_test))

Cuối cùng, bạn có thể giảm các giá trị tiêu thụ không phải là công việc trên các giới hạn trên.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.