蒙地卡羅 tf 版

      在〈蒙地卡羅 tf 版〉中尚無留言

本篇啟用 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 取消掉。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *