散熱小註解

最近公司的 IC 上了小板子有點燙, 還有技嘉的顯卡也燙, 因此對於搞清楚散熱的相關計算產生了好奇.

大家說技嘉顯卡的散熱墊片的熱傳導係數(heat transfer coefficient, K) 是 3Wm/k, 換成 12 Wm/k, VRM 和 GDDR6 的溫度就會下降. 換言之, 高導熱係數比較容易傳導熱量到正面的銅管和背面的鋁板上.

首先以顯卡來考量, 一張顯卡在 65% 功率限制下, 大概消耗 240 W. 火力全開假設是 370W (1 Watt = 1 J/s, J = 焦耳) .

Q=cm△t

W = Q/T = cm△t/T

所以一秒鐘內, 水冷想要降低顯卡 75 度 (100 –> 25), 考慮水的比熱 (容量) [1] = 4.2*103 焦耳每千克攝氏度, 水冷液 150 ml= 150 g = 0.15kg

240  = (4.2*10* 0.15 * 75) /t

t = 47250/240 =  196.875 (sec) ~= 3.3 min

所以水冷一開始會很有用, 但是過了三四分鐘水溫已經到極限, 就算冷排加風扇可以把 100 度往下降一點, 但溫差太小還是來不及散熱. 火力如果全開, t = 47250/370 = 127.7 秒 大概兩分鐘多就飽和了. 換言之水冷排不夠好, 就算水量多 3 倍也沒太大幫助. 真正能被持續帶走的熱量是水冷排貢獻的. 所以我好奇未來是不是該出現固態散熱線?

再來看散熱墊片, 散熱墊片的功能類似前面提到的水. 但為何賣散熱墊片的人不用比熱, 要用導熱係數 (W/ (m*k)) 為單位呢? 查著查著, 又看到一個相似的名詞熱導率/熱傳導率 (thermal conductivity), 因為單位一樣 [4], 看起來是兩岸翻譯不同.

根據 [2], “Thermal conductivity, also known as Lambda (denoted by the greek symbol λ)…It is measured in Watts per Metre Kelvin (W/mK).” 但這兩者應該有關係吧!? 果然老外也有人跟我有一樣的疑問 [3], 但是老中比較不好奇所以沒有討論.

有位 Elisan Magalhaes  說:

As the matter of fact, you can correlating both through the thermal diffusivity (熱擴散係數). The thermal diffusivity is defined as:
 α = k/(ρCp)
where:
α – the thermal diffusivity
k – the thermal conductivity
 ρ – density
Cp – the specific heat capacity at constant pressure
 
不過這樣還是只回答了一半, 也就是說熱擴散係數正比於導熱係數, 反比於比熱. 深一層的意義是, 比熱沒考慮到材料散熱面積, 只考慮總容量. 導熱係數有個變數是厚度. 故不能單獨決定散熱倒底好不好?  只有  α 比較能夠反映熱擴散的速度.
 
BTW, 網路上都寫α = k/ρCp, 但是按照單位來說, 應該是寫成 α = k/(ρCp) 比較不會混淆.
 
meter2/sec = (Watt / (meter * K)) / ((kg/meter3 )*(J/( kg · K))
 
12 (W/mK) = X Watt / (0.002m * 373.15 K) ==> X ~= 9W
 
所以導熱率 12 的散熱墊片, 如果有 2 mm 厚, 單面接觸 100 度攝氏度 (373.15 度 K) , 最多可以傳走  9W. 而導熱係數 3, 只譨帶走 9/4 = 2.25 W. 我理解為會多留下 6.75 W 在 PCB 上傳不走. 這部分還找不到網路上得實例, 繼續研究中.
 

[REF]

  1. 比熱容
  2. https://www.thegreenage.co.uk/article/thermal-conductivity-r-values-and-u-values-simplified/
  3. https://www.researchgate.net/post/Is_there_any_relation_between_the_heat_capacity_and_the_thermal_conductivity
  4. 熱導率

 

 

 

分類: 未分類 | 發佈留言

Tensorflow V2.0 相容性小實驗

為了一圓 AI 大夢, 我買了一塊 GTX 3090. 原本在 PCHOME 觀望三分鐘, 嫌貴沒按下去, 後來就再也買不到了!!!  電腦的東西不是應該慢慢降價嗎? “早買早享受, 晚買享折扣” 是大家都知道的定律啊!? 不過這次不一樣, 顯卡價錢還一天比一天高. 最後只好破釜沉舟買了蝦皮最後一張現貨, 而且是散熱貼片品質不好的技嘉. 

卡片到手之後, 先找個 BenchMark 來燒機, 結果老舊的 i7 扯了後腿, 分數還差正常的 3090 一成. 腦筋一賺, 來挖礦吧! 結果以前會動的 guiminer 程式都連不上礦池. 上網一查才知道電腦已經不能挖比特幣了. 不死心的我研究了一下, 得知可以在 Nicehash 挖別的幣換比特幣, 這樣果然就行了. 但是算力全開的話, VRM 瞬間就飆到 110 度. 嚇得死人了. 只敢開溫和模式當背景程式跑.

好了, 言歸正傳. 算 AI 會不會燒 VRM 要試了才知道.  然而, 客戶的事情如雪片般飛來, 我始終不能定下心跑程式. 兩個月過去, 比特幣都挖了 0.005 顆了, 但是正事還沒開工. 好不容易有清明連假, 趕快把電腦環境安裝起來. 有一篇文章跟我以前的軌跡很相似 [1], 於是我就按照這個思路來恢復環境.

不過 Google 排名靠前 – 很多人引用的文章相對都是比較舊的. 前述文章中的 Cuda 9 已經該進版到 Cuda 11.2, Cudnn 由 7.5 進版到 8.1.1, 其他流程都差不多. 按照文章一路破關, 然後在測試環境這邊卡住了. 當我執行 c = tf.matmul(a, b) 會得到:

” failed to create cublas handle: CUBLAS_STATUS_ALLOC_FAILED”

根據 [2] 所述, 這是分配記憶體的問題. 按照官網 [3] 要下tf.config.experimental.set_visible_devices.

但這個還是只能治標, 不能治本. 晚點還是會遇到

tensorflow.python.framework.errors_impl.InternalError: Blas xGEMM launch failed : a.shape=[1,2,3], b.shape=[1,3,2], m=2, n=2, k=3 [Op:MatMul]

看起來正確解答是這三行 [4]:

import tensorflow as tf
physical_devices = tf.config.list_physical_devices('GPU') 
tf.config.experimental.set_memory_growth(physical_devices[0], True)

但是要在 init 的時候下, 不能臨時抱佛腳. 所以要重來一次.

然後在 tensorflow 2.0, 過去的 tf.Session() 也被淘汰了, 要改用 f.compat.v1.Session(). tf.ConfigProto 也換成  tf.compat.v1.ConfigProto (待確認). 比較嚴重的區別是 tensorflow 2.0 預設開 eager execution. 會遇到

RuntimeError: The Session graph is empty. Add operations to the graph before calling run()

所以有三個方法:

A. 直接設定跟舊版相容 [7]:

import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()

B. 或是關掉 eager execution [6]:

tf.compat.v1.disable_eager_execution()

C. 或者先宣告 session, 而不是等要用的時候才宣告. 例如 [6]:

 # Launch the graph in a session.
 with tf.compat.v1.Session() as ses:

     # Build a graph.
     a = tf.constant(5.0)
     b = tf.constant(6.0)
     c = a * b

     # Evaluate the tensor `c`.
     print(ses.run(c))

重來一次完整的步驟就是. 從 Anaconda 打開 Python 的 terminal.

import tensorflow as tf

physical_devices = tf.config.list_physical_devices('GPU') 
tf.config.experimental.set_memory_growth(physical_devices[0], True)
tf.compat.v1.disable_eager_execution()
a = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[2, 3], name='a')
b = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[3, 2], name='b')
c = tf.matmul(a, b)
sess = tf.compat.v1.Session(config=tf.compat.v1.ConfigProto(log_device_placement=True))
print(sess.run(c))

 

[REF]

  1. https://ithelp.ithome.com.tw/articles/10237846
  2. https://www.itread01.com/content/1545441880.html
  3. https://www.tensorflow.org/guide/gpu
  4. ://stackoverflow.com/questions/43990046/tensorflow-blas-gemm-launch-failed
  5. https://stackoverflow.com/questions/55142951/tensorflow-2-0-attributeerror-module-tensorflow-has-no-attribute-session
  6. https://github.com/OlafenwaMoses/ImageAI/issues/400
  7. https://github.com/tensorflow/tensorflow/issues/25446

 

 

分類: 未分類 | 標籤: , , | 發佈留言

ATSC A/85 中的 DialNorm 和 DRC

客戶又有新的 audio 專家來開會了, 只好考前猜題準備一下相關背景知識.

首先是整體音量的方面, 這裡有一篇中文的介紹非常棒 [3]. 看了以後對 audio normalization 會有基本的了解. 計算音量的方式有 A-weight (acoustic) 和 K-weight (單純對頻域 weighting), 把整片每個聲道掃完就會得到平均音量 [6]. ITU-R BS.1770 的公式 (2) 給了一個測量 loudness 方法 [6], 它的另外一個主題是測 True Peak.

接下來專注討論人聲的部分, 在 objective audio 的時代, 據說聲音該大聲就大聲, 該小聲就小聲, 但人聲必須是正常而且受到規範的 (CALM) [7]. CALM 言明要規範的是 perceived loudness, 然後又說 “Perceived loudness compliance is based on Dialog
Normalization – dialnorm. Dialnorm is defined in ATSC A/85″, 所以 DialNorm = Perceived loudness. 

DialNorm 是一個 metadata. 它的值介於 0~31, 也就是 -30~0dB 的音量 [1], 其中 0 是 reserved. DialNorm = 1 => 0dB, DialNorm = 31 => -30dB.  DialNorm = 12 表示很大聲, DialNom = 27 表示溫和 (soft). [2]

ATSC A/85 對 DialNorm 的規範是 -24 LKFS (想成 dB 就好) [4], 並且允許大約 ± 2dB 的量測誤差. 在 AC3 的碼流中會帶著這個 metadata, 而這裡的 0dB 是片源允許的最大音量. 我們可以透過調整電視音量, 讓電視的輸出的人聲落在 DialNorm 的上下區間 (comfort zone) [5].

根據 A/85.  電視節目製作人應該要保證他們的輸出都有適當的 DialNorm 控制, 包括所有片源都固定一個 DialNorm (fixed), 或者對每部片子預設一個值 (preset), 或者是可以從外部動態取得 (agile). 至於插片或是廣告的音量, 當然也要受到管制, 這也是 A/85 的目的. (This ATSC Recommended Practice (RP) provides guidance…to effectively control program-to-interstitial loudness.) 但 program-to-interstitial 的音量變化經常都是亂源. 

A/85 還講到 DRC (Dynamic Range Control) 有開關是為了要達到 reversible, 不然動態範圍壓下去就無法復原了. 在 P.26 提到: The AC-3 DRC system should not be relied upon to control program-to-interstitial loudness variations. 表示 DRC 也管不了廣告. 在 9.1.3 (P.29) 提到, DialNorm 是反映整部片子音量的準則, 所謂太大聲大小聲要拉起來壓下去, 都是依據 DialNorm 做判斷標準.

然後 9.1.4 解釋了 Dolby MS12 (密) 文件中沒有解釋的 profile, 幸好在公開的文件中就有講. AC3 定義了五種 profile, MS12 多一種 null profile. 但 9.1.5 有講到 DRC = “none”, 也就是沒有 DRC 開關的選項.

• Music Light
• Music Standard
• Film Light
• Film Standard
• Speech

基本上這五種 profile 都跟 DialNorm 有關, 因為 Music 沒有對白, Speech 全部都是對白, 所以不同 profile 就代表不同的 DRC 調整. Light 跟不 light 的區別在於, light 版有比較多的 null area, 所以調的地方比較少. 

(The “Light” versions of the profiles have a much wider null area. Thus, gain reduction or expansion begins farther away from average program audio, resulting in less gain reduction or expansion than with the “Standard” version of the profile.) 

這也解釋了 [3] 裡面提到, Youtube 大約是 -13 LUFS, 而 Spotify 是 -14 LUFS (LHFS = LKFA). Youtube 基本上是 movie, Spotify 基本是 music. 如果對 Speech profile 開 DRC, 理論上會造成失真. 因為它已經全部都是人聲了, 壓了應該會破壞朗誦效果, 哈!

DRC 又可以分為有 metadata 和沒有 metadata. 有 metadata 就是前面講的這些, 沒有 metadata 的就像是 AGC (automatic gain control). 因為沒有 metadata, 所以是 irreversible.

[REF]

  1. https://en.wikipedia.org/wiki/Dialnorm
  2. https://www.atsc.org/wp-content/uploads/2015/03/Techniques-for-establishing-and-maintaining-audio-loudness-1.pdf
  3. 有關Audio normalization兩三事
  4. loudness, K-weighted, relative to full scale, measured with equipment that implements
    the algorithm specified by BS.1770. A unit of LKFS is equivalent to a decibel.
  5. Comfort Zone – the Comfort Zone is a range ( +2.4dB, -5.4dB) of the change to audio loudness that was found to be acceptable to a sample of listeners. The 0 dB point on the Comfort Zone scale is the average Target Loudness value or dialnorm of the channel.
  6. https://www.itu.int/dms_pubrec/itu-r/rec/bs/R-REC-BS.1770-4-201510-I!!PDF-E.pdf
  7. https://www.ensembledesigns.com/file_download/640/Ensemble_CALM_wp.pdf
分類: 技術 | 標籤: , , | 發佈留言