Keplerを使ってKubernetes上で動いているLLMの電力消費量とCO2排出量を計測する

# はじめに

<!-- 挨拶文を入れてください -->
みなさん、こんにちは。日立製作所の宮村です。  
KeplerというPrometheus Exporterを使用して、kubernetes上で動かしているPodの電力消費量とCO2排出量を計測してみました。  
今回はローカルのLLMを計測対象にします。  
<!-- 挨拶文を入れてください -->

# 1. 前提条件

- ローカルのk8sにLLM Podをデプロイされていること  
今回はLLM Modelを動かすために、Ollamaとopen-webuiを使用しました。  
使用したyamlファイルは[GitHub](https://github.com/akiho-miyamura/ollama-k8s) に置いてあるため、必要であれば使用してください。
元々docker-composeで動かしていたものをkubernetes上で動かすために、`docker-compose.yaml`を`kompose`を使用してkubernetes用のyaml群に変換したものです。  
- (Helm ChartでKeplerをインストールする場合)Helmがインストールされていること


# 2. Keplerで電力消費量とCO2排出量の可視化

## 2-1. Keplerのインストール

[Keplerのインストール手順](https://sustainable-computing.io/installation/kepler-helm/)  を参照して、Keplerをk8sにデプロイします。  
インストール方法はいくつかありますが、試すだけであればHelm Chartを使用する方法が簡単でオススメです。

1. Prometheusのインストール

```
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update

helm install prometheus prometheus-community/kube-prometheus-stack \
    --namespace monitoring \
    --create-namespace \
    --wait
```


2. KeplerのHelm ChartをHelmのリポジトリに追加

```
helm repo add kepler https://sustainable-computing-io.github.io/kepler-helm-chart
helm repo update
```

3. Keplrのインストール

```
helm install kepler kepler/kepler \
    --namespace kepler \
    --create-namespace \
    --set serviceMonitor.enabled=true \
    --set serviceMonitor.labels.release=prometheus
```
KeplerからエクスポートされたメトリクスをPromehtuesが発見できるように、`serviceMonitor`を有効にします。  
また、`serviceMonitor.labels`に、リリース名のラベルとしてpromtheusを指定します。


4. GrafanaにKeplerのダッシュボードを追加します  
GitHubにある[Kepler-Exporter.json](https://github.com/sustainable-computing-io/kepler/blob/main/grafana-dashboards/Kepler-Exporter.json)の中身を、ローカルの`kepler_dashboard.json`にコピーします。  
kepler_dashboard.json`をGrafana Podに転送します。
```
GF_POD=$(
    kubectl get pod \
        -n monitoring \
        -l app.kubernetes.io/name=grafana \
        -o jsonpath="{.items[0].metadata.name}"
)
kubectl cp kepler_dashboard.json monitoring/$GF_POD:/tmp/dashboards/kepler_dashboard.json
```

Keplerをインストールが完了しました。  
Keplerのダッシュボードは、上段: CO2排出量、中段: Namespace中にあるPodの合計電力消費量(Watt)、下段: Namespace中のPKG+DRAM+OTHER+GPUの合計電力消費量(kWh/day)で構成されています。  
![kepler_dashboard.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3915412/67441501-05c7-af54-a0a5-1e3b93e07a87.png)


# 3. 各LLMモデルの電力消費量とCO2排出量を可視化 
今回比較するモデルとモデルのパラメータ数は、以下の3つです。
- llama 3.2 3.2b
- gemma2 2b 
- gemma2 9b

[Asking 60+ LLMs a set of 20 questions](https://benchmarks.llmonitor.com/)の中から、以下の質問をベンチマークとしました。
> I went to the market and bought 10 apples. I gave 2 apples to the neighbor and 2 to the repairman. I then went and bought 5 more apples and ate 1. I also gave 3 bananas to my brother. How many apples did I remain with? Let's think step by step.

## 3-1. llama 3.2 の電力消費量とCO2排出量
![llama3b-dashboard.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3915412/cf709cb7-6ee1-48be-ebd4-aa6479b6a771.png)



## 3-2.  gemma2 2b の電力消費量とCO2排出量
![gemma2b-dashboard.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3915412/aa45595a-a704-e0c6-318d-b5fbbb8ff6cf.png)

## 3-2.  gemma2 9b の電力消費量とCO2排出量
![gemma9b-dashboard.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3915412/9ad7f329-311d-bbb9-66e2-0deba35f1d63.png)


## 3-3. 結果

以下の表は、各モデルの電力消費量とCO2排出量の結果をまとめたものです。
gemma2 9bの方がgemma2 2bより電力消費量とCO2排出量のどちらも多く、同じモデルであればパラメーター数の大きさに比例することがわかりました。
しかし、llama 3.2 3bとgemma2 9bを比較すると、パラメーター数はllama 3.2 3bの方が小さいものの電力消費量とCO2排出量は多いという結果になりました。

|model  |CO2 排出量(pounds/kWh/day) |電力消費量(kWh.day)  |
|---|---|---|
|llama 3.2 3b  | 0.1707  |0.0333  |
|gemma2 2b  | 0.0948  | 0.0180  |
| gemma2 9b |  0.1355  | 0.0257  |

この結果から、LLMモデルの電力消費量とCO2排出量について以下の2点が推論できます。

- 同一モデルであれば、パラメーター数に比例して電力消費量とCO2排出量が多くなる
- 異なるモデル間ではパラメーター数の大小よりもモデルそのもので電力消費量とCO2排出量に影響する

:::note  
あくまでも、今回検証した環境での結果のため、この結果が全てのケースに当てはまるわけではありません。ご承知おきください。
:::

# 終わりに

<!-- 〆の挨拶文を入れてください -->
以上、KeplerというPromtheus Exporterを使用して、Kubernetes上で動いているローカルLLMの電力消費量とCO2排出量を計測してみました。  
ローカルLLMを使用されている方は電力消費量などを計測するために、Keplerは非常に有効なため、ぜひ利用を検討してみてください。
<!-- 〆の挨拶文を入れてください -->

# 参考リンク
[Kepler](https://sustainable-computing.io/)  
[Ollama](https://ollama.com/)  

---

<!-- 他社商標に関する記載を適宜修正してください -->

- Kubernetesは、米国およびその他の国におけるThe Linux Foundationの商標または登録商標です
- その他、記載されている会社名および商品・製品・サービス名は、各社の商標または登録商標です