cpy_f32_f32の部分を手を入れて、結構足掻いてみた物の、最終的には現状のロジックのまま、SYCLに対する純粋な最適化を行った形で落ち着きました。
結果的に早くなっているのかどうかかなり微妙だったりしますが、動作的には一番安定してそうです。
ここのロジックを弄ると、safetensorsファイルのGPUへの読込時間がダイレクトに変わってくるので最適化したいところですが、前提条件として全く同じ形式の構造の場合はmemcpyを実行しているので、ロジックが効いてくるのは転送元と転送先の構造が違っていたり、特殊な構造だったりして、もう少し深く突っ込まないとこれ以上の最適化はできなさそうなので、含みを残したまま一旦止めたいと思います。いままで手を入れた部分も、前提が崩れそうなのでもう少し条件を厳しくして、前提条件を抑えたうえで、手を加えたロジックを動かす形にする必要がありかなぁ…。
で、次にターゲットにするものを吟味する上で出力ログからスプレッドシートで集計してみました。
| ggml_sycl_mul | 2228 |
| ggml_sycl_cpy | 2210 |
| ggml_sycl_dup | 1810 |
| ggml_sycl_add | 1546 |
| ggml_sycl_repeat | 800 |
| ggml_sycl_mul_mat | 796 |
| ggml_sycl_op_mul_mat_sycl/to_fp32_sycl | 784 |
| ggml_sycl_rms_norm | 480 |
| ggml_sycl_silu | 338 |
| ggml_sycl_norm | 328 |
| concat_impl_sycl | 288 |
| ggml_sycl_im2col | 72 |
| ggml_sycl_group_norm | 60 |
| ggml_sycl_scale | 10 |
| ggml_sycl_op_timestep_embedding | 8 |
| ggml_sycl_upscale | 6 |
| ggml_sycl_op_soft_max | 2 |
2つ分混じってしまっているかもしれませんが、比率は変わらないので有効なデータですw
やはりよく見かけるmulという乗算が一番効果的な感じがしますね。タイプ別に当りをつけるのが大変そうですが…
dupも結構影響がでかそうなのでQ8回りまで触っておいた方がいいのかな?悩むなw
0 件のコメント:
コメントを投稿