本篇啟用 tensorflow GPU 計算 pi 值,利用 tf.sqrt 及 tf.square 計算大量張量的平方及開根號求取與原點的距離。此張量的大小每次 (batch) 為 1 億個點,然後計算 50 萬次。也就是說計算 50 萬 * 1 億個點。GPU產生 1 億個亂數點非常快速,計算 1 億個點與原點的距離也只需 0.1 秒,比CPU快了很多。
GPU 一啟動,顯卡的溫度立即上升到攝氏 77 度,非常耗電。
完整代碼
todo
#!/data/pytest/.venv/bin/python3 import os os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' import tensorflow as tf batch=100_000_000 epochs=2000 incircle=0 #@tf.function def cal(): points=tf.random.uniform([2, batch], dtype=tf.float32) dist=tf.sqrt(tf.square(points[0])+tf.square(points[1])) count=tf.where(dist<=1).shape[0] return count # cpus = tf.config.list_physical_devices (device_type='CPU') # tf.config.set_visible_devices (devices=cpus[0]) #只使用 CPU, device_type預設是'CPU' for e in range(epochs): count=cal() incircle+=count area=incircle /((e+1)*batch) pi=area*4 print(f'epoch:{e+1}, pi={pi}')
計算函數 cal() 前如果加 @tf.function,是要將函數內的值改成 graph 計算 (模擬tf1的 session)。如此可加速計算效能。但在新版的 tf 沒啥效果,而且加上後就無法使用 “+=”,也就是 incirlce += count 會出錯,所以請把 @tf.function 取消掉。