21
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【2025年最新】Safari 26でWebGPU、速度は劇的UP!でもTensorflow.jsでGANを回すと…まさかの重み全ゼロ化!?

21
Last updated at Posted at 2025-09-30

はじめに

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版

gan_loss_graph_1759194015465.png

Safari 26 WebGL版

gan_loss_graph_1759197085746.png

Safari 26でのgenerator生成画像

Epoch WebGPU gen生成画像 WebGL gen生成画像
Epoch=6 epoch_006.png epoch_006.png
Epoch=7 epoch_007.png epoch_007.png

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などを使ったサービスの開発や技術支援をはじめ、幅広い支援を行っておりますので、何かありましたらお気軽にお問合せください。

お問合せ: https://gmo-connect.jp/contactus/

21
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?