Cara menjalankan Tensorflow di CPU

128

Saya telah menginstal tensorflow versi GPU pada Ubuntu 14.04.

Saya menggunakan server GPU di mana tensorflow dapat mengakses GPU yang tersedia.

Saya ingin menjalankan tensorflow pada CPU.

Biasanya saya dapat menggunakan env CUDA_VISIBLE_DEVICES=0untuk menjalankan GPU no. 0.

Bagaimana saya bisa memilih di antara CPU?

Saya tidak tertarik untuk menulis ulang kode saya dengan with tf.device("/cpu:0"):

Alexander R Johansen
sumber

Jawaban:

116

Anda dapat menerapkan device_countparameter per tf.Session:

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

Lihat juga file konfigurasi protobuf:

tensorflow/core/framework/config.proto

Ivan Aksamentov - Jatuhkan
sumber
2
Seseorang mengatakan menjalankan jaringan saraf pada CPU setelah fase pelatihan sama efisiennya dengan menjalankannya pada GPU - yaitu, hanya frasa pelatihan yang benar-benar membutuhkan GPU. Tahukah Anda apakah ini benar? Terima kasih!
Crashalot
3
Itu tidak berhasil untuk saya (tf1.1). Solusi dari fabrizioM melakukannya.
P-Gn
3
Bukankah lebih baik menggunakan CUDA_VISIBLE_DEVICESvariabel lingkungan daripada mengubah konfigurasi dalam kode?
Nandeesh
3
@Nandeesh Saya kira itu tergantung pada kebutuhan Anda. Sejauh ini setidaknya ada 53 orang yang lebih menyukai variabel lingkungan dan 35 orang yang lebih suka mengatur jumlah perangkat dalam kode. Keuntungan dari yang pertama adalah kesederhanaan dan yang lainnya adalah kontrol yang lebih eksplisit atas (beberapa) sesi dari dalam program python itu sendiri (bahwa nol tidak perlu di-hardcode, itu bisa menjadi variabel).
Ivan Aksamentov - Jatuhkan
1
@ Crashalot itu tergantung pada sifat jaringan. Misalnya, RNN bisa lebih cepat pada CPU untuk ukuran batch kecil karena sifatnya yang berurutan. CNN masih akan mendapatkan keuntungan dari GPU dalam mode inferensi, tetapi karena Anda hanya perlu menjalankannya sekali per contoh, CPU mungkin cukup cepat untuk banyak tujuan praktis.
Davidmh
174

Anda juga dapat menyetel variabel lingkungan ke

CUDA_VISIBLE_DEVICES=""

tanpa harus mengubah kode sumber.

fabrizioM
sumber
3
Seseorang mengatakan menjalankan jaringan saraf pada CPU setelah fase pelatihan sama kinerjanya dengan menjalankannya pada GPU - yaitu, hanya frasa pelatihan yang benar-benar membutuhkan GPU. Tahukah Anda apakah ini benar? Terima kasih!
Crashalot
13
@ Crashalot: Ini tidak benar. Cari berbagai tolok ukur untuk gangguan, CPU urutan besarnya lebih lambat di sana juga.
Thomas
1
@ Thomas terima kasih. saran tentang tolok ukur mana yang perlu dipertimbangkan? mungkin juga bervariasi pada beban kerja dan sifat jaringan saraf, bukan? ternyata aplikasi google translate menjalankan beberapa jaringan saraf langsung di ponsel cerdas, mungkin di cpu dan bukan gpu?
Crashalot
@fabrizioM, contoh mainan akan lebih bermanfaat.
Girishkumar
7
Ini tidak berhasil untuk saya. : / setel variabel lingkungan tetapi tensorflow masih menggunakan GPU, saya menggunakan conda virtual env, apakah ini membuat perbedaan?
Guilherme de Lazari
102

Jika jawaban di atas tidak berhasil, coba:

os.environ['CUDA_VISIBLE_DEVICES'] = '-1'
Aravindh Kuppusamy
sumber
4
Terima kasih, ini jauh lebih baik daripada opsi lain.
pengguna1098761
Sekadar catatan, opsi pertama sepertinya tidak berfungsi lagi.
agcala
Bekerja juga untuk tf 2.X saat menggunakan tf.keras.Sequentialmodel.
Nicolas M.
22

Bagi saya, hanya pengaturan CUDA_VISIBLE_DEVICESuntuk -1bekerja dengan tepat :

Pekerjaan:

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

Apakah tidak bekerja:

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
Andrzej Gis
sumber
4

Cukup gunakan kode di bawah ini.

import os
os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"
os.environ['CUDA_VISIBLE_DEVICES'] = '-1'
蔡 易 翔
sumber
0

Dalam beberapa sistem seseorang harus menentukan:

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

SEBELUM mengimpor tensorflow.

Fabrizio
sumber
0

Anda bisa menggunakan tf.config.set_visible_devices. Satu kemungkinan fungsi yang memungkinkan Anda untuk mengatur jika dan GPU mana yang akan digunakan adalah:

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)

Misalkan Anda menggunakan sistem dengan 4 GPU dan Anda ingin menggunakan hanya dua GPU, satu dengan id = 0dan satu dengan id = 2, maka perintah pertama kode Anda, segera setelah mengimpor pustaka, adalah:

set_gpu([0, 2])

Dalam kasus Anda, untuk hanya menggunakan CPU, Anda dapat menjalankan fungsi dengan daftar kosong :

set_gpu([])

Untuk kelengkapannya, jika Anda ingin menghindari bahwa inisialisasi waktu proses akan mengalokasikan semua memori pada perangkat, Anda dapat menggunakan tf.config.experimental.set_memory_growth. Terakhir, fungsi untuk mengelola perangkat mana yang akan digunakan, menempati memori GPU secara dinamis, menjadi:

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)
Roberto Amoroso
sumber
0

Solusi lain yang mungkin pada tingkat penginstalan adalah mencari varian CPU saja: https://www.tensorflow.org/install/pip#package-location

Dalam kasus saya, ini memberi sekarang:

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

Cukup pilih versi yang benar. Poin bonus untuk menggunakan venv seperti yang dijelaskan misalnya dalam jawaban ini .

Cadoiz
sumber