Cách chạy Tensorflow trên CPU


128

Tôi đã cài đặt phiên bản GPU tensorflow trên Ubuntu 14.04.

Tôi đang sử dụng máy chủ GPU nơi tensorflow có thể truy cập các GPU có sẵn.

Tôi muốn chạy tensorflow trên CPU.

Thông thường tôi có thể sử dụng env CUDA_VISIBLE_DEVICES=0để chạy trên GPU không. 0.

Làm cách nào tôi có thể chọn giữa các CPU thay thế?

Tôi không phải viết lại mã của mình với with tf.device("/cpu:0"):

Câu trả lời:


116

Bạn có thể áp dụng device_counttham số cho mỗi tf.Session:

config = tf.ConfigProto(
        device_count = {'GPU': 0}
    )
sess = tf.Session(config=config)

Xem thêm tệp cấu hình protobuf:

tensorflow/core/framework/config.proto


2
Ai đó đã nói rằng chạy mạng thần kinh trên CPU sau giai đoạn đào tạo hiệu quả như chạy chúng trên GPU - tức là chỉ có cụm từ đào tạo thực sự cần GPU. Không biết điều này có đúng không? Cảm ơn!
Crashalot

3
Điều đó không hiệu quả với tôi (tf1.1). Giải pháp của fabrizioM không.
P-Gn

3
Không phải tốt hơn nếu sử dụng CUDA_VISIBLE_DEVICESbiến môi trường thay vì thay đổi cấu hình trong mã?
Nandeesh

3
@Nandeesh Tôi đoán nó phụ thuộc vào nhu cầu của bạn. Cho đến nay, có ít nhất 53 người cảm thấy thích các biến môi trường hơn và 35 người thích đặt số lượng thiết bị trong mã. Ưu điểm của thứ nhất là sự đơn giản và thứ khác là khả năng kiểm soát rõ ràng hơn đối với (nhiều) phiên từ bên trong chính chương trình python (số 0 đó không cần thiết phải được mã hóa cứng, nó có thể là một biến).
Ivan Aksamentov - Thả

1
@Crashalot nó phụ thuộc vào bản chất của mạng. Ví dụ: RNN có thể nhanh hơn trên CPU đối với kích thước lô nhỏ do tính chất tuần tự của nó. CNN sẽ vẫn được hưởng lợi từ GPU ở chế độ suy luận, nhưng vì bạn chỉ cần chạy chúng một lần cho mỗi ví dụ, một CPU thể đủ nhanh cho nhiều mục đích thực tế.
Davidmh

174

Bạn cũng có thể đặt biến môi trường thành

CUDA_VISIBLE_DEVICES=""

mà không cần phải sửa đổi mã nguồn.


3
Ai đó đã nói rằng việc chạy mạng thần kinh trên CPU sau giai đoạn đào tạo cũng hiệu quả như chạy chúng trên GPU - tức là chỉ có cụm từ đào tạo thực sự cần GPU. Không biết điều này có đúng không? Cảm ơn!
Crashalot

13
@Crashalot: Điều này không đúng. Tìm kiếm các điểm chuẩn khác nhau cho sự can thiệp, CPU cũng chậm hơn ở đó.
Thomas

1
@Thomas cảm ơn. gợi ý về những tiêu chuẩn nào để xem xét? có lẽ cũng khác nhau về khối lượng công việc và bản chất của mạng lưới thần kinh, phải không? dường như ứng dụng google dịch chạy một số mạng thần kinh trực tiếp trên điện thoại thông minh, có lẽ là trên cpu chứ không phải gpu?
Crashalot

@fabrizioM, một ví dụ về đồ chơi sẽ hữu ích hơn.
Girishkumar

7
Điều này đã không làm việc cho tôi. : / đặt biến môi trường nhưng tensorflow vẫn sử dụng GPU, tôi đang sử dụng conda virtual env, điều này có tạo ra sự khác biệt không?
Guilherme de Lazari

102

Nếu các câu trả lời trên không hoạt động, hãy thử:

os.environ['CUDA_VISIBLE_DEVICES'] = '-1'

4
Cảm ơn, điều này tốt hơn nhiều so với các tùy chọn khác.
user1098761

Chỉ đối với bản ghi, tùy chọn đầu tiên dường như không hoạt động nữa.
agcala

Cũng hoạt động cho tf 2.X khi sử dụng tf.keras.Sequentialcác mô hình.
Nicolas M.

22

Đối với tôi, chỉ cài đặt hoạt động CUDA_VISIBLE_DEVICESchính xác -1:

Làm:

import os
import tensorflow as tf

os.environ['CUDA_VISIBLE_DEVICES'] = '-1'

if tf.test.gpu_device_name():
    print('GPU found')
else:
    print("No GPU found")

# No GPU found

Liệu không làm việc:

import os
import tensorflow as tf

os.environ['CUDA_VISIBLE_DEVICES'] = ''    

if tf.test.gpu_device_name():
    print('GPU found')
else:
    print("No GPU found")

# GPU found

4

Chỉ cần sử dụng mã bên dưới.

import os
os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"
os.environ['CUDA_VISIBLE_DEVICES'] = '-1'

0

Trong một số hệ thống, người ta phải chỉ định:

import os
os.environ["CUDA_DEVICE_ORDER"]="PCI_BUS_ID"
os.environ["CUDA_VISIBLE_DEVICES"]=""  # or even "-1"

TRƯỚC KHI nhập tensorflow.


0

Bạn có thể sử dụng tf.config.set_visible_devices. Một chức năng khả thi cho phép bạn đặt nếu và sử dụng GPU nào là:

import tensorflow as tf

def set_gpu(gpu_ids_list):
    gpus = tf.config.list_physical_devices('GPU')
    if gpus:
        try:
            gpus_used = [gpus[i] for i in gpu_ids_list]
            tf.config.set_visible_devices(gpus_used, 'GPU')
            logical_gpus = tf.config.experimental.list_logical_devices('GPU')
            print(len(gpus), "Physical GPUs,", len(logical_gpus), "Logical GPU")
        except RuntimeError as e:
            # Visible devices must be set before GPUs have been initialized
            print(e)

Giả sử bạn đang sử dụng một hệ thống có 4 GPU và bạn chỉ muốn sử dụng hai GPU, một có id = 0và một có id = 2, thì lệnh đầu tiên trong mã của bạn, ngay sau khi nhập các thư viện, sẽ là:

set_gpu([0, 2])

Trong trường hợp của bạn, để chỉ sử dụng CPU, bạn có thể gọi hàm với một danh sách trống :

set_gpu([])

Để hoàn thiện, nếu bạn muốn tránh việc khởi tạo thời gian chạy sẽ phân bổ tất cả bộ nhớ trên thiết bị, bạn có thể sử dụng tf.config.experimental.set_memory_growth. Cuối cùng, chức năng quản lý thiết bị nào sẽ sử dụng, chiếm dụng động bộ nhớ GPU, trở thành:

import tensorflow as tf

def set_gpu(gpu_ids_list):
    gpus = tf.config.list_physical_devices('GPU')
    if gpus:
        try:
            gpus_used = [gpus[i] for i in gpu_ids_list]
            tf.config.set_visible_devices(gpus_used, 'GPU')
            for gpu in gpus_used:
                tf.config.experimental.set_memory_growth(gpu, True)
            logical_gpus = tf.config.experimental.list_logical_devices('GPU')
            print(len(gpus), "Physical GPUs,", len(logical_gpus), "Logical GPU")
        except RuntimeError as e:
            # Visible devices must be set before GPUs have been initialized
            print(e)

0

Một giải pháp khả thi khác ở cấp độ cài đặt là tìm kiếm biến thể chỉ dành cho CPU: https://www.tensorflow.org/install/pip#package-location

Trong trường hợp của tôi, điều này mang lại ngay bây giờ:

pip3 install https://storage.googleapis.com/tensorflow/windows/cpu/tensorflow_cpu-2.2.0-cp38-cp38-win_amd64.whl

Chỉ cần chọn đúng phiên bản. Điểm thưởng khi sử dụng một venv như được giải thích, ví dụ: trong câu trả lời này .

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.