初心者 ) AI業界においてNVIDIAの歴史やすごさを調べてみた

## はじめに
最近ニュースや社内で何かと見かけるNVIDIAのGPUですが、
- なんでそんなに株価あがってるの？
とか
- AIのGPUといえばNVIDIAなの？とか気になっていました。

GPU超初心者ですが、初学者目線でGPUや会社の歴史などもまとめてみたので同じように気になっている方がいらっしゃったらご覧いただければと思います。

## NVIDIAの概要
### 会社概要
- 本社所在地: カリフォルニア州サンタクララ
- 時価総額2兆ドル（2024年5月）
    - Alphabet越え！
- GPUの開発・研究に特化したファブレスメーカー
    - 工場建設費を削減している
- 世界のAI向け半導体のシェア8割 (2024年5月)
    - 人工知能アルゴリズムの訓練に関する市場のほぼ100％を占める

### NVIDIA 歴史（とGPU利用法の変化）
　1. 創業と初期
- 1993年：ビデオゲームのリアルタイムグラフィックスを高品質に描画するためのGPU製造会社として設立
- 1999年：世界初のGPUと言われる「GeForce 256」を発表
　　　　　 ナスダックに上場
      
　2. GPUの使用用途の変化
(GPUがゲームグラフィックにとどまらず映画やアニメーションの動画加工に使用され始める)
- 2006年：CUDAの発表
- 2008年：CUDAを使用したスーパーコンピューター『Titan』が世界で一番計算の早いスパコンに
～AIの基本となる機械学習やニューラルネットワークを研究していた科学者もGPUを活用しはじめる
- 2012年：GPUでトレーニングされたAlexNetというディープニューラルネットワークが画像認識のコンテストで圧勝

　3. AIとディープラーニングの発展 
(ディープラーニングのブーム)
- NVIDIAのGPUとCUDAプラットフォームにがAI研究者や開発者によって広く採用
 
　4. 現在と将来 (2020年代以降)
- NVIDIAはAI研究のリーダーとしての地位を確立

## NVIDIAの強み
### CUDA（クーダ：Compute Unified Device Architecture）
GPU＋AIの開発環境を押さえている
- NVIDIAが2007年に開発した並列計算アーキテクチャとプログラミングモデル
- C、C++などをベースに、GPU上での計算を行うための専用のAPIとライブラリを提供
- GPGPUプログラミングのデファクトスタンダードである
    - GPGPUプログラミング：GPUの性能を極限まで引き上げるためのプログラミング
    - デファクトスタンダード：エンジニアたちの中でプラットフォームとしての地位を確立すること

- NVIDIAだけが開発を行えるクローズドソースである
- オープン規格であるOpenCLもあるが特にAI関連ではCUDAほど活用されていない

つまり、
- GPUを用いた機械学習などはほとんどCUDAを前提に作られている
＋
- CUDAはNVIDIAのGPUしか動作しない

ことがNVIDIAが強い大きな理由となりそうです。

## CUDAの機能
では、CUDAとはどのようなものか？について調査しました。
CUDAはC言語に2つの拡張を加えてあります。
1. ホストとデバイス間のデータ転送機能
    - CPUとGPU間で問題と計算結果を受け渡しできるように
2. ホスト側から，デバイスに多数のスレッドを処理させる機能
    - CPU側からfor文で回っているような問題をGPUの得意分野である並列処理に書き換えるイメージ

 ## CUDAの基礎用語
 CUDAを理解する上で基礎となる用語をまとめてみました。
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763355/1ed3ece8-7f2a-d9f6-7fbe-ac53acb4912c.png)


## CUDAに適した問題とは
forループ中で比較的単純な処理を膨大な回数繰り返すケース
- 条件判定が多い処理は不向き。処理が途中で止まることもある
- 個々の処理は互いに独立でなくてはならない
- スレッドの実行順序は仮定できない

こちらはCUDAというよりGPU全般に当てはまりそうですね。
## A10でNVIDIAのインターフェースを見てみる
- nvidia-smi
    - NVIDIAのシステム管理インターフェイス
    - カードの世代によって、さまざまなレベルの情報を収集できる
    - GPU設定オプション（ECCメモリ機能など）を有効/無効にできる

それでは実際に実行していきます。
```
$ nvidia-smi
Fri Jun 21 07:11:56 2024       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 470.239.06   Driver Version: 470.239.06   CUDA Version: 11.4     |
|-------------------------------+----------------------+----------------------+
| 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 A10          Off  | 00000000:00:04.0 Off |                    0 |
|  0%   28C    P8     8W / 150W |      0MiB / 22731MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+
```
- CUDA Version: 11.4
がインストールされていることが分かりました。

その他にもGPU名や温度、メモリ使用量なども確認できます。


## さいごに
CUDAはNVIDIA社のサイトに膨大な量のサンプルプログラムが掲載されています。
まずはこれらを読んで実際にNVIDIAのGPU動かすことがCUDA理解の早道だと思いますので、次回は実際に動かしてみたいです。

## 参考文献
- なぜGPUはディープラーニング・AI開発に向いているの？選び方は？NVIDIAさんに聞いてきました
https://www.kagoya.jp/howto/engineer/hpc/gpu_deeplearning_ai/
- NVIDIA/CUDA Toolkitのダウンロード
https://developer.nvidia.com/cuda-toolkit
- 茨城大学工学部 CUDAの導入
https://co-crea.jp/wp-content/uploads/2016/07/File_2.pdf