生成AIの量子化の果てに生まれた、進捗バーを量子化するPythonライブラリを公開しました【実用性なし】

![quantum-progress-barAll.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3755504/aa16a256-9940-44ee-ada5-4c98ba22c4c6.gif)
---

突然ですが、皆さんは**量子化**というキーワードを知っていますか？

生成AIにおける**量子化**とは、精度をほとんど劣化させずに、AIモデルのサイズを削減することです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3755504/81487ad7-7caa-4a10-b205-67a5f133c963.png)


さて、そんな量子化について、ローカルでAIを処理しているとき私はふとあることを思いました。

## このモデルの量子化…進捗ぜんぜん進まないな…

最近のヘビー級のモデルは**どいつもこいつもサイズがデカい！**
ユーザーのリソースは無限だと思っている節がありますね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3755504/e7d168be-a406-41f2-93b9-aa3dce804f2e.png)
> 終わらない進捗

進捗バーが微動だにしないと楽しくなくなってきます。

AIが量子化するなら、**待ち時間中、進捗バー側も量子化する必要があるのではないでしょうか？**

**それも、より高度な方法で。**

## より高度な方法とは
よくわからない概念には、さらにわからない概念をぶつけるのが効果的です。

量子でわからない概念と言えば…

## 量子力学ですよね？

### [量子力学とは](https://ja.wikipedia.org/wiki/%E9%87%8F%E5%AD%90%E5%8A%9B%E5%AD%A6)
> 量子力学（りょうしりきがく、（英: quantum mechanics）は、一般相対性理論と共に現代物理学の根幹を成す理論・分野。主として、分子や原子あるいはそれを構成する電子などを対象とし、その微視的な物理現象を記述する力学である。

>コペンハーゲン解釈においては、観測が行われると、状態を記述する波動関数が一つの状態に収縮する。上記の標準解釈では、観測という行為がいつどのように量子系に影響を与えて、その状態が実現したのかについては定義されない。

はい、もうわかりませんね。
ですが、**進捗バーを食い入るように見つめている私たちにはピッタリです。**

## 進捗バーの量子力学化(quantum-progress-bar)

ということで、Pythonライブラリ`quantum-progress-bar`を公開しました。

https://github.com/FlatBone/quantum-progress-bar

**観測するたびに進捗が変化する進捗バーが使えるようになります**

![gif](https://github.com/user-attachments/assets/0e416bbd-2278-4a31-81ee-c89b75ca3b01)

![quantum-progress-bar4.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3755504/f885c86d-38cf-487e-95b0-157386bb9d77.gif)


### インストール

Pythonを使える環境でライブラリをインストールしてください。
```bash
pip install quantum-progress-bar
```


### 基本的な使い方
詳細は[README_ja.md](https://github.com/FlatBone/quantum-progress-bar/blob/main/README_ja.md)をご覧ください。

基本はこれ

```python
from quantum_progress_bar import quantum_progress

quantum_progress(total=100, width=50, delay=0.2)
```

出力は毎回ランダム。こんな感じになります(ちゃんと終わります)：

```
[▓▒░█▄▌        ] 42%  # 初観測
[█▄▌▓▒         ] 38%  # 時間反転
[█▓▒░█▄▌▓█....█] 100%  # 奇跡の収束
```

もっと本格的に使いたいならクラス形式で

```python
from quantum_progress_bar import QuantumProgressBar

pb = QuantumProgressBar(total_steps=100)
for _ in range(10):
    pb.quantum_progress()
    print(f" 残り時間: {pb.uncertainty_estimate()}")
```

残り時間は「`5 minutes (probably between 3 minutes - 12 minutes)`」とか、たまに「`42 light years ± uncertainty principle`」みたいになります。

### tqdm風に使う

`tqdm`風にイテレータを使うなら`qqdm`をインポートしてください。

```python
from quantum_progress_bar import qqdm

for i in qqdm(range(200)):
    time.sleep(0.01)
```

![quantum-progress-bar5.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3755504/f680358f-db52-4ecf-9664-7a018bd81ec4.gif)


### 手っ取り早く遊ぶコード

```py
from quantum_progress_bar import QuantumProgressBar, quantum_progress, quantum_loading, qqdm
import time


print("🔬 Quantum Progress Bar Demo 🔬")
print("=" * 50)

print("\n1. Basic usage of quantum progress bar")
print("-" * 30)
# Display a quantum progress bar
quantum_progress(total=100, width=50, delay=0.1)

print("\n2. Direct usage of QuantumProgressBar class")
print("-" * 30)
# Initialize a quantum progress bar
pb = QuantumProgressBar(total_steps=1000, collapse_factor=0.7, uncertainty_level=0.9)

# Display progress
for _ in range(5):
    progress = pb.quantum_progress(width=50)
    print(f" Estimated time: {pb.uncertainty_estimate()}")
    time.sleep(0.1)

print("\n3. Quantum entanglement")
print("-" * 30)
# Entangle with another progress bar
pb2 = QuantumProgressBar(total_steps=100)
pb.entangle(pb2)
pb.update(steps=10)  # Affects both bars due to entanglement
pb.quantum_progress(width=50)
print()
pb2.quantum_progress(width=50)
print()

print("\n4. Quantum loading animation")
print("-" * 30)
quantum_loading(message="Loading quantum state", duration=10, width=50)

print("\n5. Usage of qqdm function like tqdm")
print("-" * 30)
print("Example of wrapping an iterator:")
for i in qqdm(range(200)):
    # Some processing
    time.sleep(0.05)

print("\nExample of using as a context manager:")
with qqdm(total_steps=20) as qbar:
    for i in range(20):
        # Some processing
        time.sleep(0.05)
        qbar.update(1)

print("\nThank you for enjoying the quantum progress display!")

```


### Cline
実装にはClineをかなりの割合使いました。Claude3.7 sonnet
1ドルくらい。READMEを先に書いてから作るのがいいのかもしれない。



## 実用性


**進捗をあいまいにしたい工程**に使うのにおすすめです。

あとは**非エンジニアに見せる時に「プログラムがめちゃくちゃ頑張っている！！」** と見せるために使えるかもしれません。


## 参考文献
偉大な参考文献
- [Über das Gesetz der Energieverteilung im Normalspektrum](https://onlinelibrary.wiley.com/doi/10.1002/andp.19013090310)
- [Über einen die Erzeugung und Verwandlung des Lichtes betreffenden heuristischen Gesichtspunkt](https://onlinelibrary.wiley.com/doi/10.1002/andp.19053220607)
- [Quantisierung als Eigenwertproblem](https://onlinelibrary.wiley.com/doi/10.1002/andp.19263840404)

## リンク
READMEも遊んでいるのでご覧ください。

https://github.com/FlatBone/quantum-progress-bar