วิธีเรียกใช้ Tensorflow บน CPU


128

ฉันได้ติดตั้งเทนเซอร์โฟลว์เวอร์ชัน GPU บน Ubuntu 14.04 แล้ว

ฉันอยู่บนเซิร์ฟเวอร์ GPU ที่ tensorflow สามารถเข้าถึง GPU ที่มีอยู่

ฉันต้องการเรียกใช้เทนเซอร์โฟลว์บนซีพียู

โดยปกติฉันสามารถใช้env CUDA_VISIBLE_DEVICES=0เพื่อรันบน GPU ได้ 0

ฉันจะเลือกระหว่างซีพียูแทนได้อย่างไร

ฉันไม่ได้ขัดขวางในการเขียนรหัสของฉันใหม่ด้วย with tf.device("/cpu:0"):

คำตอบ:


116

คุณสามารถใช้device_countพารามิเตอร์ต่อtf.Session:

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

ดูไฟล์ config protobuf ด้วย:

tensorflow/core/framework/config.proto


2
มีคนกล่าวว่าการรันโครงข่ายประสาทบนซีพียูหลังจากขั้นตอนการฝึกอบรมนั้นมีประสิทธิภาพเทียบเท่ากับการรันบน GPU นั่นคือเฉพาะวลีการฝึกอบรมเท่านั้นที่ต้องการ GPU จริงๆ คุณรู้หรือไม่ว่าเป็นความจริง? ขอบคุณ!
Crashalot

3
ไม่ได้ผลสำหรับฉัน (tf1.1) วิธีแก้ปัญหาของ fabrizioM ทำ
P-Gn

3
การใช้CUDA_VISIBLE_DEVICESตัวแปรสภาพแวดล้อมแทนการเปลี่ยน config ในโค้ดไม่ดีกว่าหรือ?
Nandeesh

3
@Nandeesh ฉันเดาว่ามันขึ้นอยู่กับความต้องการของคุณ จนถึงขณะนี้มีอย่างน้อย 53 คนที่รู้สึกถึงตัวแปรสภาพแวดล้อมและ 35 คนที่ชอบกำหนดจำนวนอุปกรณ์ในรหัส ข้อได้เปรียบของประการแรกคือความเรียบง่ายและอีกประการหนึ่งคือการควบคุมเซสชัน (หลาย) ที่ชัดเจนกว่าจากภายในโปรแกรม python เอง (ศูนย์นั้นไม่จำเป็นต้องฮาร์ดโค้ด แต่สามารถเป็นตัวแปรได้)
Ivan Aksamentov - วาง

1
@Crashalot ขึ้นอยู่กับลักษณะของเครือข่าย ตัวอย่างเช่น RNN สามารถทำงานได้เร็วกว่าบน CPU สำหรับขนาดแบทช์ขนาดเล็กเนื่องจากลักษณะของลำดับ CNN จะยังคงได้รับประโยชน์จาก GPU ในโหมดอนุมาน แต่เนื่องจากคุณต้องเรียกใช้เพียงครั้งเดียวต่อหนึ่งตัวอย่างซีพียูอาจเร็วพอสำหรับวัตถุประสงค์ในทางปฏิบัติหลายประการ
Davidmh

174

คุณยังสามารถตั้งค่าตัวแปรสภาพแวดล้อมเป็น

CUDA_VISIBLE_DEVICES=""

โดยไม่ต้องแก้ไขซอร์สโค้ด


3
มีคนกล่าวว่าการใช้งาน neural nets บน CPU หลังจากขั้นตอนการฝึกอบรมนั้นมีประสิทธิภาพเทียบเท่ากับการรันบน GPU นั่นคือเฉพาะวลีการฝึกอบรมที่ต้องการ GPU จริงๆ คุณรู้หรือไม่ว่าเป็นความจริง? ขอบคุณ!
Crashalot

13
@Crashalot: นี่ไม่เป็นความจริง มองหาเกณฑ์มาตรฐานต่างๆสำหรับสัญญาณรบกวนซีพียูก็มีลำดับความสำคัญช้าลง
Thomas

1
@ โทมัสขอบคุณ ข้อเสนอแนะเกี่ยวกับเกณฑ์มาตรฐานที่ควรพิจารณา? อาจแตกต่างกันไปตามปริมาณงานและลักษณะของอวนประสาทใช่ไหม? เห็นได้ชัดว่าแอป Google translate ใช้งาน neural nets โดยตรงบนสมาร์ทโฟนซึ่งน่าจะอยู่ที่ cpu ไม่ใช่ gpu?
Crashalot

@fabrizioM ตัวอย่างของเล่นจะมีประโยชน์มากขึ้น
Girishkumar

7
สิ่งนี้ไม่ได้ผลสำหรับฉัน : / ตั้งค่าตัวแปรสภาพแวดล้อม แต่ tensorflow ยังคงใช้ GPU ฉันใช้ conda virtual env สิ่งนี้สร้างความแตกต่างหรือไม่?
Guilherme de Lazari

102

หากคำตอบข้างต้นไม่ได้ผลให้ลอง:

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

4
ขอบคุณนี่ดีกว่าตัวเลือกอื่น ๆ มาก
user1098761

สำหรับบันทึกตัวเลือกแรกดูเหมือนจะใช้ไม่ได้อีกต่อไป
agcala

ใช้งานได้กับ tf 2.X เมื่อใช้tf.keras.Sequentialโมเดล
Nicolas M.

22

สำหรับฉันการตั้งค่าCUDA_VISIBLE_DEVICESให้-1ทำงานได้อย่างแม่นยำเท่านั้น:

ผลงาน:

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

ไม่ได้ทำงาน:

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

เพียงใช้รหัสด้านล่าง

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

0

ในบางระบบต้องระบุ:

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

ก่อนนำเข้าเทนเซอร์โฟลว์


0

คุณสามารถใช้tf.config.set_visible_devices. ฟังก์ชันที่เป็นไปได้อย่างหนึ่งที่ช่วยให้คุณตั้งค่าว่าจะใช้ GPU หรือไม่:

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)

สมมติว่าคุณอยู่ในระบบที่มี GPU 4 ตัวและคุณต้องการใช้ GPU เพียงสองตัวคือ GPU ที่มีid = 0และตัวที่มีid = 2จากนั้นคำสั่งแรกของโค้ดของคุณทันทีหลังจากนำเข้าไลบรารีจะเป็น:

set_gpu([0, 2])

ในกรณีของคุณหากต้องการใช้เฉพาะ CPU คุณสามารถเรียกใช้ฟังก์ชันด้วยรายการว่าง :

set_gpu([])

tf.config.experimental.set_memory_growthเพื่อความสมบูรณ์ถ้าคุณต้องการที่จะหลีกเลี่ยงที่เริ่มต้นรันไทม์จะจัดสรรหน่วยความจำทั้งหมดเกี่ยวกับอุปกรณ์ที่คุณสามารถใช้ สุดท้ายฟังก์ชั่นจัดการอุปกรณ์ที่จะใช้โดยครอบครองหน่วยความจำ GPU แบบไดนามิกจะกลายเป็น:

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

อีกวิธีหนึ่งที่เป็นไปได้ในระดับการติดตั้งคือการค้นหาตัวแปรเฉพาะ CPU: https://www.tensorflow.org/install/pip#package-location

ในกรณีของฉันสิ่งนี้ให้ตอนนี้:

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

เพียงเลือกรุ่นที่ถูกต้อง คะแนนโบนัสสำหรับการใช้ venv เช่นอธิบายเช่นในคำตอบนี้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.