開源 vGPU 方案 HAMi: corememory 隔離測試

hami-isolation-test.png

本文主要對開源的 vGPU 方案 HAMi 的 GPU Core&Memory 隔離功能進行測試。

省流:

HAMi vGPU 方案提供的 Core&Memory 隔離基本符合預期:

  • Core 隔離:Pod 能使用的算力會圍繞設定值波動,但是一段時間內平均下來和申請的 gpucores 基本一致
  • Memory 隔離:Pod 中申請的 GPU 內存超過設定值時會直接提示 CUDA OOM

1.環境準備

簡單說一下測試環境

  • GPU:A40 * 2
  • K8s:v1.23.17
  • HAMi:v2.3.13

GPU 環境

使用 GPU-Operator 安裝 GPU 驅動、Container Runtime 之類的,參考 ->GPU 環境搭建指南:使用 GPU Operator 加速 Kubernetes GPU 環境搭建

然后安裝 HAMi,參考->開源 vGPU 方案:HAMi,實現細粒度 GPU 切分

測試環境

直接使用 torch 鏡像啟動 Pod 作為測試環境就好

docker pull pytorch/pytorch:2.4.1-cuda11.8-cudnn9-runtime

測試腳本

可以使用 PyTorch 提供的 Examples 作為測試腳本

 https://github.com/pytorch/examples/tree/main/imagenet

這邊是一個訓練的 Demo,會打印每一步的時間,算力給的越低,每一步耗時也就越長。

具體用法也很簡單:

先克隆項目

git clone https://github.com/pytorch/examples.git

然后啟動服務模擬消耗 GPU 的任務即可

cd /mnt/imagenet/
python main.py -a resnet18 --dummy

配置

需要在 Pod 中注入環境變量 GPU_CORE_UTILIZATION_POLICY=force,默認的限制策略時該 GPU 只有一個 Pod 在使用時就不會做算力限制。

ps:這也算是一種優化,可以提升 GPU 利用率,反正閑著也是閑著,如果要強制限制就必須增加環境變量

完整 Yaml

以 hostPath 方式將 examples 項目掛載到 Pod 里進行測試,并將 command 配置為啟動命令。

通過配置 vGPU 限制為 30% 或者 60% 分別做測試。

完整 yaml 如下:

apiVersion: v1
kind: Pod
metadata:name: hami-30namespace: default
spec:containers:- name: simple-containerimage: pytorch/pytorch:2.4.1-cuda11.8-cudnn9-runtimecommand: ["python", "/mnt/imagenet/main.py", "-a", "resnet18", "--dummy"]# 使用 sleep infinity 保持容器持續運行resources:requests:cpu: "4"memory: "32Gi"nvidia.com/gpu: "1"nvidia.com/gpucores: "30"nvidia.com/gpumem: "20000"limits:cpu: "4"memory: "32Gi"nvidia.com/gpu: "1" # 1 個 GPUnvidia.com/gpucores: "30" # 申請使用 30% 算力nvidia.com/gpumem: "20000" # 申請 20G 顯存(單位為 MB)env:- name: GPU_CORE_UTILIZATION_POLICYvalue: "force" # 設置環境變量 GPU_CORE_UTILIZATION_POLICY 為 forcevolumeMounts:- name: imagenet-volumemountPath: /mnt/imagenet # 容器內掛載點- name: shm-volumemountPath: /dev/shm # 掛載共享內存到容器的 /dev/shmrestartPolicy: Nevervolumes:- name: imagenet-volumehostPath:path: /root/lixd/hami/examples/imagenet # 主機目錄路徑type: Directory- name: shm-volumeemptyDir:medium: Memory # 使用內存作為 emptyDir

2.Core 隔離測試

30%算力

gpucores 設置為 30% 效果如下:

[HAMI-core Msg(15:140523803275776:libvgpu.c:836)]: Initializing.....
[HAMI-core Warn(15:140523803275776:utils.c:183)]: get default cuda from (null)
[HAMI-core Msg(15:140523803275776:libvgpu.c:855)]: Initialized
/mnt/imagenet/main.py:110: UserWarning: nccl backend >=2.5 requires GPU count>1, see https://github.com/NVIDIA/nccl/issues/103 perhaps use 'gloo'warnings.warn("nccl backend >=2.5 requires GPU count>1, see https://github.com/NVIDIA/nccl/issues/103 perhaps use 'gloo'")
=> creating model 'resnet18'
=> Dummy data is used!
Epoch: [0][   1/5005]        Time  4.338 ( 4.338)        Data  1.979 ( 1.979)        Loss 7.0032e+00 (7.0032e+00)        Acc@1   0.00 (  0.00)        Acc@5   0.00 (  0.00)
Epoch: [0][  11/5005]        Time  0.605 ( 0.806)        Data  0.000 ( 0.187)        Loss 7.1570e+00 (7.0590e+00)        Acc@1   0.00 (  0.04)        Acc@5   0.39 (  0.39)
Epoch: [0][  21/5005]        Time  0.605 ( 0.706)        Data  0.000 ( 0.098)        Loss 7.1953e+00 (7.1103e+00)        Acc@1   0.00 (  0.06)        Acc@5   0.39 (  0.56)
Epoch: [0][  31/5005]        Time  0.605 ( 0.671)        Data  0.000 ( 0.067)        Loss 7.2163e+00 (7.1379e+00)        Acc@1   0.00 (  0.04)        Acc@5   1.56 (  0.55)
Epoch: [0][  41/5005]        Time  0.608 ( 0.656)        Data  0.000 ( 0.051)        Loss 7.2501e+00 (7.1549e+00)        Acc@1   0.39 (  0.07)        Acc@5   0.39 (  0.60)
Epoch: [0][  51/5005]        Time  0.611 ( 0.645)        Data  0.000 ( 0.041)        Loss 7.1290e+00 (7.1499e+00)        Acc@1   0.00 (  0.09)        Acc@5   0.39 (  0.60)
Epoch: [0][  61/5005]        Time  0.613 ( 0.639)        Data  0.000 ( 0.035)        Loss 6.9827e+00 (7.1310e+00)        Acc@1   0.00 (  0.12)        Acc@5   0.39 (  0.60)
Epoch: [0][  71/5005]        Time  0.610 ( 0.635)        Data  0.000 ( 0.030)        Loss 6.9808e+00 (7.1126e+00)        Acc@1   0.00 (  0.11)        Acc@5   0.39 (  0.61)
Epoch: [0][  81/5005]        Time  0.617 ( 0.630)        Data  0.000 ( 0.027)        Loss 6.9540e+00 (7.0947e+00)        Acc@1   0.00 (  0.11)        Acc@5   0.78 (  0.64)
Epoch: [0][  91/5005]        Time  0.608 ( 0.628)        Data  0.000 ( 0.024)        Loss 6.9248e+00 (7.0799e+00)        Acc@1   1.17 (  0.12)        Acc@5   1.17 (  0.64)
Epoch: [0][ 101/5005]        Time  0.616 ( 0.626)        Data  0.000 ( 0.022)        Loss 6.9546e+00 (7.0664e+00)        Acc@1   0.00 (  0.11)        Acc@5   0.39 (  0.61)
Epoch: [0][ 111/5005]        Time  0.610 ( 0.625)        Data  0.000 ( 0.020)        Loss 6.9371e+00 (7.0565e+00)        Acc@1   0.00 (  0.11)        Acc@5   0.39 (  0.61)
Epoch: [0][ 121/5005]        Time  0.608 ( 0.621)        Data  0.000 ( 0.018)        Loss 6.9403e+00 (7.0473e+00)        Acc@1   0.00 (  0.11)        Acc@5   0.78 (  0.60)
Epoch: [0][ 131/5005]        Time  0.611 ( 0.620)        Data  0.000 ( 0.017)        Loss 6.9016e+00 (7.0384e+00)        Acc@1   0.00 (  0.10)        Acc@5   0.00 (  0.59)
Epoch: [0][ 141/5005]        Time  0.487 ( 0.619)        Data  0.000 ( 0.016)        Loss 6.9410e+00 (7.0310e+00)        Acc@1   0.00 (  0.10)        Acc@5   0.39 (  0.58)
Epoch: [0][ 151/5005]        Time  0.608 ( 0.617)        Data  0.000 ( 0.015)        Loss 6.9647e+00 (7.0251e+00)        Acc@1   0.00 (  0.10)        Acc@5   0.00 (  0.56)

每一步耗時大概在 0.6 左右。

GPU 使用率

hami-isolation-test1.png

可以看到,使用率是圍繞著我們設定的目標值 30% 進行波動,在一個時間段內平均下來差不多就是 30% 左右。

60% 算力

60% 時的效果

root@j99cloudvm:~/lixd/hami# kubectl logs -f hami-60
[HAMI-core Msg(1:140477390922240:libvgpu.c:836)]: Initializing.....
[HAMI-core Warn(1:140477390922240:utils.c:183)]: get default cuda from (null)
[HAMI-core Msg(1:140477390922240:libvgpu.c:855)]: Initialized
/mnt/imagenet/main.py:110: UserWarning: nccl backend >=2.5 requires GPU count>1, see https://github.com/NVIDIA/nccl/issues/103 perhaps use 'gloo'warnings.warn("nccl backend >=2.5 requires GPU count>1, see https://github.com/NVIDIA/nccl/issues/103 perhaps use 'gloo'")
=> creating model 'resnet18'
=> Dummy data is used!
Epoch: [0][   1/5005]        Time  4.752 ( 4.752)        Data  2.255 ( 2.255)        Loss 7.0527e+00 (7.0527e+00)        Acc@1   0.00 (  0.00)        Acc@5   0.39 (  0.39)
Epoch: [0][  11/5005]        Time  0.227 ( 0.597)        Data  0.000 ( 0.206)        Loss 7.0772e+00 (7.0501e+00)        Acc@1   0.00 (  0.25)        Acc@5   1.17 (  0.78)
Epoch: [0][  21/5005]        Time  0.234 ( 0.413)        Data  0.000 ( 0.129)        Loss 7.0813e+00 (7.1149e+00)        Acc@1   0.00 (  0.20)        Acc@5   0.39 (  0.73)
Epoch: [0][  31/5005]        Time  0.401 ( 0.360)        Data  0.325 ( 0.125)        Loss 7.2436e+00 (7.1553e+00)        Acc@1   0.00 (  0.14)        Acc@5   0.78 (  0.67)
Epoch: [0][  41/5005]        Time  0.190 ( 0.336)        Data  0.033 ( 0.119)        Loss 7.0519e+00 (7.1684e+00)        Acc@1   0.00 (  0.10)        Acc@5   0.00 (  0.62)
Epoch: [0][  51/5005]        Time  0.627 ( 0.327)        Data  0.536 ( 0.123)        Loss 7.1113e+00 (7.1641e+00)        Acc@1   0.00 (  0.11)        Acc@5   1.17 (  0.67)
Epoch: [0][  61/5005]        Time  0.184 ( 0.306)        Data  0.000 ( 0.109)        Loss 7.0776e+00 (7.1532e+00)        Acc@1   0.00 (  0.10)        Acc@5   0.78 (  0.65)
Epoch: [0][  71/5005]        Time  0.413 ( 0.298)        Data  0.343 ( 0.108)        Loss 6.9763e+00 (7.1325e+00)        Acc@1   0.39 (  0.13)        Acc@5   1.17 (  0.67)
Epoch: [0][  81/5005]        Time  0.200 ( 0.289)        Data  0.000 ( 0.103)        Loss 6.9667e+00 (7.1155e+00)        Acc@1   0.00 (  0.13)        Acc@5   1.17 (  0.68)
Epoch: [0][  91/5005]        Time  0.301 ( 0.284)        Data  0.219 ( 0.102)        Loss 6.9920e+00 (7.0990e+00)        Acc@1   0.00 (  0.13)        Acc@5   1.17 (  0.67)
Epoch: [0][ 101/5005]        Time  0.365 ( 0.280)        Data  0.000 ( 0.097)        Loss 6.9519e+00 (7.0846e+00)        Acc@1   0.00 (  0.12)        Acc@5   0.39 (  0.66)
Epoch: [0][ 111/5005]        Time  0.239 ( 0.284)        Data  0.000 ( 0.088)        Loss 6.9559e+00 (7.0732e+00)        Acc@1   0.39 (  0.13)        Acc@5   0.78 (  0.62)
Epoch: [0][ 121/5005]        Time  0.368 ( 0.286)        Data  0.000 ( 0.082)        Loss 6.9594e+00 (7.0626e+00)        Acc@1   0.00 (  0.13)        Acc@5   0.78 (  0.63)
Epoch: [0][ 131/5005]        Time  0.363 ( 0.287)        Data  0.000 ( 0.075)        Loss 6.9408e+00 (7.0535e+00)        Acc@1   0.00 (  0.13)        Acc@5   0.00 (  0.60)
Epoch: [0][ 141/5005]        Time  0.241 ( 0.288)        Data  0.000 ( 0.070)        Loss 6.9311e+00 (7.0456e+00)        Acc@1   0.00 (  0.12)        Acc@5   0.00 (  0.58)
Epoch: [0][ 151/5005]        Time  0.367 ( 0.289)        Data  0.000 ( 0.066)        Loss 6.9441e+00 (7.0380e+00)        Acc@1   0.00 (  0.13)        Acc@5   0.78 (  0.58)
Epoch: [0][ 161/5005]        Time  0.372 ( 0.290)        Data  0.000 ( 0.062)        Loss 6.9347e+00 (7.0317e+00)        Acc@1   0.78 (  0.13)        Acc@5   1.56 (  0.59)
Epoch: [0][ 171/5005]        Time  0.241 ( 0.290)        Data  0.000 ( 0.058)        Loss 6.9432e+00 (7.0268e+00)        Acc@1   0.00 (  0.13)        Acc@5   0.39 (  0.58)

每一步時間是在 0.3 左右,30% 時時間是 0.6,降為了 50%,也符合算力從 30% 提升到 60% 翻倍的情況。

GPU 使用率則是

hami-isolation-test2.png

同樣是在一定范圍內波動,平均下來和限制的 60% 也基本一致。

3.Memory 隔離測試

只需要在 Pod Resource 中知道使用 20000M 內存

    resources:requests:cpu: "4"memory: "8Gi"nvidia.com/gpu: "1"nvidia.com/gpucores: "60"nvidia.com/gpumem: "200000"

然后到 Pod 中查詢看到的就只有 20000M

root@hami-30:/mnt/b66582121706406e9797ffaf64a831b0# nvidia-smi
[HAMI-core Msg(68:139953433691968:libvgpu.c:836)]: Initializing.....
Mon Oct 14 13:14:23 2024
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 525.147.05   Driver Version: 525.147.05   CUDA Version: 12.0     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  NVIDIA A40          Off  | 00000000:00:07.0 Off |                    0 |
|  0%   30C    P8    29W / 300W |      0MiB / 20000MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------++-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+
[HAMI-core Msg(68:139953433691968:multiprocess_memory_limit.c:468)]: Calling exit handler 68

測試腳本

然后跑一個腳本測試 申請 20000M 之后是否就會 OOM

import torch
import sysdef allocate_memory(memory_size_mb):# 將 MB 轉換為字節數,并計算需要分配的 float32 元素個數num_elements = memory_size_mb * 1024 * 1024 // 4  # 1 float32 = 4 bytestry:# 嘗試分配顯存print(f"Attempting to allocate {memory_size_mb} MB on GPU...")x = torch.empty(num_elements, dtype=torch.float32, device='cuda')print(f"Successfully allocated {memory_size_mb} MB on GPU.")except RuntimeError as e:print(f"Failed to allocate {memory_size_mb} MB on GPU: OOM.")print(e)if __name__ == "__main__":# 從命令行獲取參數,如果未提供則使用默認值 1024MBmemory_size_mb = int(sys.argv[1]) if len(sys.argv) > 1 else 1024allocate_memory(memory_size_mb)

開始

root@hami-30:/mnt/b66582121706406e9797ffaf64a831b0/lixd/hami-test# python test_oom.py 20000
[HAMI-core Msg(1046:140457967137280:libvgpu.c:836)]: Initializing.....
Attempting to allocate 20000 MB on GPU...
[HAMI-core Warn(1046:140457967137280:utils.c:183)]: get default cuda from (null)
[HAMI-core Msg(1046:140457967137280:libvgpu.c:855)]: Initialized
[HAMI-core ERROR (pid:1046 thread=140457967137280 allocator.c:49)]: Device 0 OOM 21244149760 / 20971520000
Failed to allocate 20000 MB on GPU: OOM.
CUDA error: unrecognized error code
CUDA kernel errors might be asynchronously reported at some other API call, so the stacktrace below might be incorrect.
For debugging consider passing CUDA_LAUNCH_BLOCKING=1
Compile with `TORCH_USE_CUDA_DSA` to enable device-side assertions.[HAMI-core Msg(1046:140457967137280:multiprocess_memory_limit.c:468)]: Calling exit handler 1046

直接 OOM 了,看來是有點極限了,試試 19500

root@hami-30:/mnt/b66582121706406e9797ffaf64a831b0/lixd/hami-test# python test_oom.py 19500
[HAMI-core Msg(1259:140397947200000:libvgpu.c:836)]: Initializing.....
Attempting to allocate 19500 MB on GPU...
[HAMI-core Warn(1259:140397947200000:utils.c:183)]: get default cuda from (null)
[HAMI-core Msg(1259:140397947200000:libvgpu.c:855)]: Initialized
Successfully allocated 19500 MB on GPU.
[HAMI-core Msg(1259:140397947200000:multiprocess_memory_limit.c:468)]: Calling exit handler 1259

一切正常,說明 HAMi 的 memory 隔離是正常的。


**【Kubernetes 系列】**持續更新中,搜索公眾號【探索云原生】訂閱,文章。


4.小結

測試結果如下:

  • Core 隔離

    • gpucores 設置為 30% 時任務每一步耗時 0.6s,Grafana 顯示 GPU 算力使用率在 30% 附近波動

    • gpucores 設置為 60% 時任務每一步耗時 0.3s,Grafana 顯示 GPU 算力使用率在 60% 附近波動

  • Memory 隔離

    • gpumem 設置為 20000M,嘗試申請 20000M 時 OOM,申請 19500 時正常。

可以認為 HAMi vGPU 方案提供的 core&memory 隔離基本符合預期:

  • Core 隔離:Pod 能使用的算力會圍繞設定值波動,但是一段時間內平均下來和申請的 gpucores 基本一致
  • Memory 隔離:Pod 中申請的 GPU 內存超過設定值時會直接提示 CUDA OOM

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/87624.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/87624.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/87624.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

openstack安裝并初始化

openstack安裝并初始化openStack 概述OpenStack 起源什么是Openstackopenstack優勢使用本地倉庫離線安裝系統基本環境設置為系統設置本地倉庫創建openstack-train的倉庫更新系統安裝部署工具一鍵安裝設置橋接網絡通過 Dashboard 體驗 OpenStack 功能創建云主機創建網絡(1)用adm…

解決 Cannot create Swift scratch context

場景復現 Xcode 控制臺輸出: Cannot create Swift scratch context (couldnt create a Clang Importer)Analysis 分析 發生了什么? 在調試 Swift 代碼或在 LLDB 里執行 po/expr 命令時,LLDB 需要為表達式臨時創建一份 “Swift scratch co…

機械時代的計算

1、機械計算起源 最近在想平衡三進制的除法,想看看那么大牛是怎么做的,資料很少,但還是有的,有但是看不懂,也不知靠不靠譜,后面跟著實踐了能行,下面就看看Balanced Ternary Arithmetic&#xff…

相機光學(四十八)——漸暈

1.什么是漸暈 漸暈,又稱“光衰減”,在光學和攝影中很常見,簡單來說就是與中心相比,圖像角落變暗。漸暈要么是由光學引起的,要么是在后期處理中故意添加的,目的是將觀看者的視線從角落的干擾物吸引到圖像的中…

LabVIEW多通道阻抗測試儀

LabVIEW集成 Keysight 數字萬用表與 NI 矩陣開關卡,構建多通道阻抗測試系統,實現設備連接電纜的多芯阻抗自動化測試,涵蓋數據采集、分析、記錄與顯示功能,適用于高精度阻抗檢測場景,展現LabVIEW在儀器控制與自動化測試…

MySQL的5.0和8.0版本區別

目錄 1、MySQL版本-- 》5版本 1.1、InnoDB存儲引擎 1.2、存儲過程和觸發器 1.3、視圖 1.4、增強的查詢優化器 1.5、增強的索引支持 1.6、外鍵支持 1.7、分區表和分布式查詢 2、MySQL版本-- 》8版本 2.1、性能 2.2、字符編碼改變 2.3、持久化保存 2.4、隱藏索引和降…

python實現簡單的地圖繪制與標記20250705

用python語言繪制顯示范圍不大于上海地區的地圖 您的代碼實現了一個 上海武館地理信息系統,主要功能是通過可視化地圖展示上海各區的傳統武術館信息。 通過和deeps對話一晚上實現的,我就是描述修改 高德的api key我搞了一會,平時很少接觸密…

Qt開發:QListWidget的介紹和使用

文章目錄 一、QListWidget的簡介二、QListWidget的基本用法三、QListWidget的數據操作2.1 插入數據2.2 查找數據2.3 選項設置 四、QListWidget的信號與槽 一、QListWidget的簡介 QListWidget 是 Qt 框架中用于顯示和操作條目列表的控件,它是 QListView 的一個子類&a…

React Native 親切的組件們(函數式組件/class組件)和陌生的樣式

寫多了taro, 看見react native中的組件好親切啊,幾乎一模一樣。 一、函數式組件 — 常用 1)無狀態,每次刷新都是生成一個新的狀態 2)基于狀態變化的管理 3)簡潔,代碼少,易于服用 import Reac…

Spring boot之身份驗證和訪問控制

本文筆記跟隨于遇見狂神說老師的視頻 一.SpringSecurity(安全) 1.相關概念 在web開發中,安全第一位,有簡單的方法,比如:攔截器,過濾器 也有安全框架,比如:SpringSecu…

C#使用開源框架NetronLight繪制流程圖

之前使用MindFusion.Diagramming繪制流程圖確認很方便,只能試用版,如果長期使用,需要收費。 C#使用MindFusion.Diagramming框架繪制流程圖(2):流程圖示例_c# 畫流程圖控件-CSDN博客 這里找一個簡易開源框架NetronLight,GIT下載地…

支持向量機(SVM)在腦部MRI分類中的深入應用與實現

?? 博主簡介:CSDN博客專家、CSDN平臺優質創作者,高級開發工程師,數學專業,10年以上C/C++, C#, Java等多種編程語言開發經驗,擁有高級工程師證書;擅長C/C++、C#等開發語言,熟悉Java常用開發技術,能熟練應用常用數據庫SQL server,Oracle,mysql,postgresql等進行開發應用…

AtCoder AT_abc413_c [ABC413C] Large Queue 題解

題目大意 有一個初始為空的序列 A A A, Q Q Q 次操作分為兩類: 第一類:將 c c c 個 x x x 放到 A A A 的末尾。第二類:將前 k k k 個數的和輸出并移除它們。 思路 這是一個求和問題,想到的第一個思路是前綴和…

「源力覺醒 創作者計劃」_文心大模型開源:開啟 AI 新時代的大門

在人工智能的浩瀚星空中,大模型技術宛如一顆璀璨的巨星,照亮了無數行業前行的道路。自誕生以來,大模型憑借其強大的語言理解與生成能力,引發了全球范圍內的技術變革與創新浪潮。百度宣布于 6 月 30 日開源文心大模型 4.5 系列&…

Git 怎么判斷是否沖突?

📌 [Q&A] Git 怎么判斷是否沖突? Git 使用的是三路合并算法(Three-way Merge),它比較: 共同祖先提交(base) 當前分支的改動(ours) 被合并分支的改動&am…

在sf=0.1時測試fireducks、duckdb、polars的tpch

首先,從https://github.1git.de/fireducks-dev/polars-tpch下載源代碼包,將其解壓縮到/par/fire目錄。 然后進入此目錄,運行 SCALE_FACTOR0.1 ./run-fireducks.sh,腳本會首先安裝所需的包,編譯tpch的數據生成器&#x…

AWS多賬號管理終極指南:從安裝配置到高效使用

引言:為什么需要多賬號管理? 在云計算時代,企業使用多個AWS賬號已成為最佳實踐。根據AWS Well-Architected Framework,多賬號架構可以: 實現環境隔離(生產/測試/開發)滿足不同業務單元的安全要求簡化資源管理和成本分配符合合規性要求(如SOC2、ISO27001)本文將手把手…

UE5音頻技術

1 . 調制器 Modulator 調整參數 調制器可以使聲音每次音高都不一樣 2. 隨機 節點 3. 混音器 Mixer 混合兩個音頻 4. 串聯器 Concatenator 按循序播放 5.多普勒 Doppler 根據距離音頻變化 6.包絡線 Enveloper 武器充能發射 7.混響

創客匠人視角:創始人 IP 打造與知識變現的培訓賦能體系

在知識付費行業進入精耕期的當下,為何部分企業投入大量培訓卻收效甚微?創客匠人 CEO 老蔣通過服務 5W 知識博主的經驗指出:唯有將創始人 IP 思維與培訓體系深度融合,才能讓培訓成為知識變現的 “轉換器”。一、內訓體系重構&…

基于Java+SpringBoot的三國之家網站

源碼編號:S591 源碼名稱:基于SpringBoot的三國之家網站 用戶類型:雙角色,用戶、管理員 數據庫表數量:20 張表 主要技術:Java、Vue、ElementUl 、SpringBoot、Maven 運行環境:Windows/Mac、…