はじめに
GMOコネクトの永田です。
前回の記事で、Tensorflow.js x WebGPUをChromeで試しましたが、昨日MacOS 26.0.1がリリースされましたので早速MacOS26にアップグレードし、Safari 26でもWebGPUを試してみました!
(マイナーバージョンが出ると、ちょっとは枯れたかな?で、入れてみる人)
まとめ
- Safari 26でWebGPUが動作することは確認、WebGLより35%ほど高速に!
- ただし、Safari x Tensorflow.js x WebGPUではGradientsが0になる問題があり、実用にはまだ早そう
実施した環境
| 種別 | version |
|---|---|
| MacOS | 26.0.1(25A362) |
| Safari | 26.0.1 (21622.1.22.11.15) |
| Chrome | 140.0.7339.214 |
| Tensorflow.js | 4.22 |
- MacBook Pro Apple M4 Max、メモリ36GB
- 前回と同じく、GANでEpoch10回平均を取得
- 念の為Chromeも再測定
実測してみた
| Browser | backend | Epochあたりの学習時間 |
|---|---|---|
| Chrome | webgpu | 2.9秒/epoch |
| Chrome | webgl | 4.8秒/epoch(Epoch=1除く) |
| Safari | webgpu | 5.3秒/epoch(Epoch7から結果NG) |
| Safari | webgl | 7.2秒/epoch(Epoch=1除く) |
- ChromeはMacOS15.6.1と同じ結果
- SafariはWebGPUでも動作するが、学習結果が異常となる
- Chrome・Safariともに、WebGPUはEpoch=1の処理に時間がかかる(WebGL初期化?)
Browser WebGL WebGPU Chrome 16.4秒 3.5秒 Safari 18.1秒 6.4秒
Safari 26でのGAN学習結果異常について
何回か試したのですが、Epoch=7からlossが0になり、generatorの生成画像も真っ黒になる、という事象になりました。
Safari 26 でのロスグラフ
Safari 26 WebGPU版
Safari 26 WebGL版
Safari 26でのgenerator生成画像
| Epoch | WebGPU gen生成画像 | WebGL gen生成画像 |
|---|---|---|
| Epoch=6 | ![]() |
![]() |
| Epoch=7 | ![]() |
![]() |
weightsの状態確認
以下のコードで雑にLayer毎の重みを見てみます。(コードはClaude Sonnet4に教えてもらいました😊)
件数が多いので先頭10件毎ピックアップしています。
generator.layers.forEach((layer, layerIndex) => {
const weights = layer.getWeights();
weights.forEach((weight, weightIndex) => {
const first10 = Array.from(weight.dataSync()).slice(0, 10).map(v => v.toFixed(4));
console.log(`L${layerIndex}-W${weightIndex} [${weight.shape.join('×')}]: [${first10.join(', ')}]`);
});
});
Epoch=0のweights
[Log] L0-W0 [40×140]: [-0.1183, 0.1191, -0.0690, -0.1096, -0.0424, -0.0382, -0.1767, 0.0433, 0.0951, -0.0394]
[Log] L0-W1 [140]: [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000]
[Log] L1-W0 [140×80]: [0.0731, 0.0494, -0.0754, -0.0128, -0.1052, -0.0449, -0.0034, 0.0628, -0.0108, -0.1024]
[Log] L1-W1 [80]: [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000]
[Log] L2-W0 [80×784]: [0.0664, 0.0382, -0.0612, 0.0256, -0.0171, -0.0024, -0.0030, -0.0704, 0.0127, 0.0062]
[Log] L2-W1 [784]: [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000]
Epoch=5のweights
[Log] L0-W0 [40×140]: [-0.1036, 0.1207, -0.0759, -0.0965, -0.0529, -0.0436, -0.2042, 0.0712, 0.1102, -0.0482]
[Log] L0-W1 [140]: [0.0014, 0.0299, 0.0542, 0.0277, 0.0536, 0.0247, 0.0320, 0.0335, 0.0300, 0.0527]
[Log] L1-W0 [140×80]: [0.1236, 0.0474, -0.0794, -0.0128, -0.0769, -0.0379, -0.0031, 0.0569, -0.0148, -0.0406]
[Log] L1-W1 [80]: [0.0375, -0.0069, 0.0139, -0.0002, 0.0180, 0.0357, 0.0006, 0.0310, 0.0381, 0.0361]
[Log] L2-W0 [80×784]: [0.0741, 0.0299, -0.0293, 0.0045, -0.0212, -0.0194, 0.0150, -0.0648, 0.0011, 0.0102]
[Log] L2-W1 [784]: [-0.0132, -0.0084, -0.0021, -0.0094, -0.0173, -0.0136, -0.0213, -0.0156, -0.0160, -0.0172]
Epoch=7のweights
[Log] L0-W0 [40×140]: [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000]
[Log] L0-W1 [140]: [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000]
[Log] L1-W0 [140×80]: [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000]
[Log] L1-W1 [80]: [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000]
[Log] L2-W0 [80×784]: [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000]
[Log] L2-W1 [784]: [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000]
Epoch=10のweights
[Log] L0-W0 [40×140]: [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000]
[Log] L0-W1 [140]: [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000]
[Log] L1-W0 [140×80]: [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000]
[Log] L1-W1 [80]: [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000]
[Log] L2-W0 [80×784]: [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000]
[Log] L2-W1 [784]: [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000]
問題事象(生成画像が真っ黒になる)が発生したところから、weights=Zeroになってしまっています・・・😇
Tensorflow.jsのIssue確認
Tensorflow.jsのIssuesを見ましたが、ぴったり当てはまるIssueはなさそうでした。
関係するか分かりませんが、WebGPUでGradientsがZeroになるというIssueがあり、ブラウザまたはTensorflow.js側に何か問題がある可能性がありそうです。(私のソースがbugっている可能性もあり)
後日バージョンアップされていたら、再確認をしてみたいと思います。
(MacOS FirefoxにWebGPUが対応したぐらいかな?)
(再掲)まとめ
- Safari 26でWebGPUが動作することは確認、WebGLより35%ほど高速に!
- ただし、Safari x Tensorflow.js x WebGPUではGradientsが0になる問題があり、実用にはまだ早そう
弊社では、機械学習・AI・LLMなどを使ったサービスの開発や技術支援をはじめ、幅広い支援を行っておりますので、何かありましたらお気軽にお問合せください。





