ニュース

フライングパドル フレームワーク アドバンスト 3.0!「統合された大規模モデルのトレーニングとプッシュ」を含む 5 つの新機能について説明する記事

2024-08-01

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

基本ソフトウェアとしての深層学習フレームワークは、深層学習技術の急速な進歩を促進するだけでなく、人工知能技術の広範な応用のための強固な基盤を築きます。

ディープ ラーニング フレームワークは、データと操作を高度に抽象化する便利で使いやすい開発インターフェイスを開発者に提供するため、開発者は基礎となるデータ処理の詳細に行き詰まることなく、アルゴリズムとモデルの設計に集中できるようになります。これらのインターフェイスを通じて、開発者は複雑な基盤となるハードウェア開発の詳細を直接認識して対処する必要がなくなるため、開発効率とエクスペリエンスが大幅に向上します。第 2 に、深層学習フレームワークは自動微分という強力な機能も提供します。開発者は通常、順伝播ネットワークのコードを記述するだけで済みますが、面倒な逆伝播ネットワークはフレームワークによって自動的に完成されます。

中国初の自社開発の機能豊富なオープンソースおよびオープンディープラーニングプラットフォームとして、Fei Paddle は、デフォルトで静的画像を使用するバージョン 1.0 から、デフォルトで動的画像を使用し、統合を実現できるバージョン 2.0 までリリースされました。 Fei Paddle フレームワークは、動的グラフィックスの柔軟性と静的グラフィックスの効率性を完全に統合することができ、最近、モデルのハイブリッド並列トレーニングをサポートしています。大型モデルの時代、正式リリースされました!フライング パドルは、新世代のフレーム技術革新を正式に開始しました。

デザイン思考

深層学習フレームワークの設計は、人工知能技術の開発を促進するために重要であり、その中心的な設計目標は、深層学習技術の革新と応用を容易にすることです。

これを行う方法?

フレームワークは、開発者とハードウェア メーカーのニーズを十分に考慮する必要があります。

ユーザーの観点から見ると、優れた深層学習フレームワークは開発者に究極の開発エクスペリエンスを提供する必要があります。これは、ユーザーフレンドリーな開発環境を提供するだけでなく、開発者の学習コストと時間コストを大幅に削減し、開発の利便性を大幅に向上できることが重要です。この目的を達成するために、フライング パドル フレームワークは、開発効率を大幅に向上させる「動きと静的な統合、トレーニングとプッシュの統合、および自動並列処理」というコンセプトを提唱しています。

ハードウェア適応の観点から見ると、最新の深層学習アプリケーションは多くの場合、さまざまなハードウェア プラットフォームで実行する必要があるため、フレームワークはさまざまなハードウェア デバイスと互換性があり、適応可能である必要があります。これには、異なるハードウェア インターフェイス間の違いをインテリジェントに分離し、広範なハードウェア適応性を実現するフレームワークが必要です。同時に、ハードウェアのパフォーマンスを最大限に発揮するために、フレームワークには、ハードウェア リソースを利用する際にソフトウェアとハ​​ードウェアが連携して最適なパフォーマンスを確保する機能も必要です。

同時に、優れたフレームワークには、AI テクノロジー開発の全体的な傾向と業界の実際のアプリケーションのニーズも考慮する必要があります。

技術開発の面では、大規模言語モデル (LLM)、MOE (専門家混合)、マルチモダリティ、科学知能 (AI for Science) などの最先端のテクノロジーが徐々に新しい研究のホットスポットになってきています。モデルの複雑さが増すにつれて、コンピューティング ボトルネック、ストレージ ボトルネック、メモリ アクセス ボトルネック、通信ボトルネックなどの問題が徐々に顕著になり、分散トレーニングと全体的なパフォーマンスの最適化の必要性がますます高まっています。

工業化レベルでは、フレームワークにはトレーニング、圧縮、推論の統合をサポートするフルプロセス機能が必要です。これは、モデルのトレーニングから最適化、実際の展開と推論に至るまで、このフレームワークが深層学習テクノロジーに対する業界の実際のニーズを満たす完全かつ効率的なソリューションを提供する必要があることを意味します。

産学研究のあらゆる分野の開発者を継続的かつ安定的にサポートできるのは、トレンドを追い続け、磨きに耐えられるフレームワークだけです。


フライングパドルフレーム3.0の設計コンセプトと主な特徴

上記の要件を要約すると、Fei Paddle は、「動的と静的を統合し、トレーニングとプッシュを統合し、自動並列化、自動最適化、および広範なハードウェア適応を統合する」ディープ ラーニング フレームワークを開発者に提供します。開発者は、ちょうどライティング スタンドのように分散コードを作成できます。 - 複雑な通信やスケジューリング ロジックを認識する必要がなく、コードのみで大規模なモデルを開発できます。ハードウェア開発言語を使用して複雑なオペレーター カーネル コードを作成する必要がなく、数式を書くのと同じように Python でニューラル ネットワークを作成できます。効率的な運用を実現できます。

Flying Paddle Framework バージョン 3.0 は、動的と静的を統合し、トレーニングとプッシュを統合するという 2.x バージョンの設計コンセプトを引き継ぎ、開発インターフェイスは 2.x バージョンと完全に互換性があります。これは、バージョン 2.x を使用して開発されたコードは、ほとんどの場合、変更せずにバージョン 3.0 で直接実行できることを意味します。これは、動的および静的な統合自動並列化、コンパイラ自動最適化、大規模モデルのトレーニングとプッシュ統合、大規模モデルのマルチハードウェア適応という 4 つの新機能の導入に重点を置いています。これらの機能は、Flying Paddle Framework バージョン 2.6 以前から開発されており、現在は外部で試用されている段階に達しています。これらの新機能により、ユーザー エクスペリエンス、パフォーマンス、二次開発の利便性、およびハードウェアの適応性の点で大幅な改善がもたらされました。Fei Paddle はバージョン 3.0 を正式にリリースしました。このバージョンには、フレームワーク 2.x バージョンの既存の機能のいくつかの改良が含まれており、新しい機能を使用せずに成熟し、安定しています。

フレームワークアーキテクチャの概要

深層学習フレームワークの上記の特性を実現するには、さまざまな複雑なモデル構築をサポートし、多様なチップとのシームレスな統合を実現できるように、フレームワークのアーキテクチャを慎重に設計する必要があります。次に、直感的なアーキテクチャ図を使用して、フライング パドルの新世代フレームワークでカバーされる機能モジュールと、これらのモジュール間の相互作用と接続を詳細に示します。以下は Flying Paddle Framework 3.0 のアーキテクチャ図です。


フライング パドル フレームワーク 3.0 アーキテクチャ図

豊富なインターフェイス: Flying Paddle Framework は、テンソル表現、数学的計算、モデル ネットワーキング、最適化戦略など、深層学習に関連するさまざまな開発インターフェイスを提供します。これらのインターフェイスを通じて、開発者は基礎となる技術的な詳細に立ち入ることなく、独自の深層学習モデルを簡単に構築およびトレーニングできます。

開発インターフェイスの下では、フライング パドル フレームワークは、プレゼンテーション層、スケジューリング層、オペレーター層、アダプテーション層の 4 つのレベルに分割できます。

プレゼンテーション層: 計算グラフの表現と変換に焦点を当て、動的から静的へ(動的グラフから静的グラフへ)、自動微分、自動並列処理、演算子の組み合わせ、およびスケーラブルな中間表現 PIR による計算グラフの最適化などのコア機能を提供します。支持を固める。

スケジューリング層: コードや計算グラフのインテリジェントなオーケストレーションと効率的なスケジューリングを担当し、実際のニーズに応じてグラフィックス メモリとメモリを管理および最適化し、動的グラフと静的グラフの効率的な実行をサポートします。開発者がモデル開発に動的グラフィックスを使用することを選択するか、静的グラフィックスを使用することを選択するかに関係なく、フライング パドル フレームワークは、最適なリソース使用率を確保しながら効率的な実行環境を提供できます。

オペレーター層: ニューラル ネットワーク コンパイラー CINN とオペレーター ライブラリ PHI で構成され、テンソル定義、オペレーター定義、自動オペレーター融合、オペレーター カーネル実装などの主要な機能をカバーします。

アダプテーション層: デバイス管理、オペレーター適応、通信適応、コンパイル アクセスなどの機能を含む、基盤となるチップへの適応を実装するために使用されます。

以下では、Flying Paddle 3.0 バージョン アーキテクチャの新しいメジャー アップグレードに焦点を当てます。このアップグレードには主に次のモジュールが含まれます。

1) スケーラビリティの高い中間表現 PIR は、アーキテクチャ全体で統一された中間表現を作成することで、フレームワーク層の各モジュールの壁を打ち破り、科学計算、コンパイル最適化、大規模モデルの分野でフライングパドルの可能性を高めます。 ;

2) ニューラル ネットワーク コンパイラーは、自動融合とポリシー調整を通じてモデルのエンドツーエンドのパフォーマンスを自動的に最適化し、大幅に向上させます。

3) 自動並列化により、モデル開発のコストと大規模モデル シーンのパフォーマンス最適化が削減され、大規模モデル シーンのユーザー エクスペリエンスが大幅に向上します。

高度に拡張された中間表現 PIR

計算グラフの中間表現 (IR) は、深層学習フレームワークのパフォーマンスの最適化、推論の展開、コンパイラー、その他の方向性の重要な基礎です。近年、ますます多くのフレームワークや研究者がディープ ラーニングのニューラル ネットワーク モデルの最適化にコンパイラー テクノロジーを導入し、これに基づいてコンパイラーの概念、テクノロジー、ツールを使用してニューラル ネットワークを自動的に最適化し、コードを生成しています。大規模モデルの時代には、柔軟性、拡張性、完全性の点で IR に対する要件が高くなります。

そのため、Feipiao はバージョン 3.0 で中間表現 IR の定義をインフラストラクチャ レベルで標準化し、アーキテクチャ全体の統一表現と上流および下流の全方向での開発結果の共有を実現します。 Feipiao の新世代 IR アーキテクチャは、高い柔軟性と高い拡張性という 2 つの重要な側面に焦点を当てており、より完全で堅牢なセマンティック表現機能、アーキテクチャ全体の統一表現、および複雑なセマンティックを実現するための効率的なプラグイン可能なパフォーマンス最適化戦略 (Pass) メカニズムを通じて開発されています。大規模モデルの自動並列化の下で豊富なセグメンテーション戦略をより便利にサポートし、ニューラル ネットワーク コンパイラーとシームレスに接続して、自動パフォーマンス最適化とマルチハードウェア適応を実現します。



Paddle Intermediate Representation (PIR) は、Type、Attribute、Op、Trait、Interface をカバーする拡張性の高い基本コンポーネントのセットを下部に抽象化し、Dialect の概念を導入することで、開発者に柔軟な拡張と自由なカスタマイズを可能にし、包括的なソリューションを提供します。堅牢なセマンティック表現機能。モデル表現層では、複数の方言のモジュール管理と統一された複数端末表現を通じて、トレーニングと推論を統合したアーキテクチャ全体の統一表現が実現され、演算子とコンパイラ間のシームレスな接続が実現され、自動最適化とマルチハードウェア適応が実現されます。がサポートされています。グラフ変換層では、基盤となるモジュールを統合し、基本概念を簡素化することで、低コストで使いやすく、高性能な開発エクスペリエンスと、豊富でプラグイン可能なパス最適化メカニズムをユーザーに提供します。フライング パドル PIR は、静的単一割り当て (SSA) の原則に従って、モデルが有向非巡回グラフと同等であることを保証し、値と演算を使用して計算グラフを抽象化します。ここで、演算はノードを表し、値はエッジを表します。

操作は計算グラフ内のノードを表します。各操作は演算子を表し、0 個以上の領域を含みます。 領域はクロージャを表し、0 個以上のブロックを含めることができます。 Block は、静的単一割り当て (SSA) 原則に準拠し、0 個以上のオペレーションを含む基本ブロックを表します。これら 3 つの間のループの入れ子を通じて、任意の複雑な文法構造を構築できます。

値は、計算グラフ内の有向エッジを表します。これは 2 つの操作を接続するために使用され、プログラム内の使用定義チェーン (つまり UD チェーン) を記述します。このうち、OpResult は定義端として機能し、Value を定義するために使用されます。一方、OpOperand は使用端として機能し、特定の Value の使用法を記述します。

Feipiao は、カスタマイズの柔軟性と開発の容易さを考慮した、PatternRewriter と Declarative Rewrite Rule (略して DRR) という 2 つのパス開発メカニズムを提供します。 3 段階のパス開発方法により、開発者は基礎となる IR の詳細に注意を払うことなく、パス ロジックの処理に集中できるようになります。 PIR のパス開発メカニズムを使用すると、パス開発コストが 58% 削減され、推論シナリオに適用すると、84% 以上のモデル推論が 10% 以上高速化されます。

ニューラルネットワークコンパイラの自動最適化

コンパイラ技術を開発する必要がある理由は 3 つあります。

1) ハードウェア開発の傾向: ハードウェア開発の歴史と技術進化の特性を組み合わせると、コンピューティング能力の開発速度はメモリ アクセスのパフォーマンス、CPU パフォーマンス、およびメモリ アクセスのパフォーマンスに比べてはるかに速く、メモリ アクセスを多用するオペレーターのパフォーマンスに影響を与えます。ノルムクラス、アクティベーションなど)、CPU パフォーマンスとバス帯域幅は、スケジューリング、パフォーマンスに影響します。コンパイラベースの自動融合一般最適化テクノロジは、複数のオペレータを 1 つの大きなオペレータに統合することができ、メモリ アクセスの量とオペレータの数を削減することで、モデルのパフォーマンスを大幅に向上させることができます。

2) モデル開発の傾向: モデル構造は多様性の特徴を持ち、多様性の要求はコンパイラーの全体的な最適化に大きく依存します。

3) 複数のハードウェアの最適化: 市場にはさまざまな種類のハードウェアがあり、各ハードウェアの最適化には多くの労力が必要です。大幅にコストが削減されます。

例を通してこれを説明しましょう。 Llama モデルでよく使用される RMS 正規化 (Root Mean Square Layer Normalization) を例に挙げます。その計算式は比較的単純で明確です。



RMS 正規化の計算を実装する必要があるとします。最も簡単な方法は、フライング パドル フレームワークによって提供されるテンソル演算開発インターフェイスを使用し、二乗、和、除算、ルートなどの演算を呼び出すことです。コードは次のとおりです。



上記のコードは開発が簡単ですが、パフォーマンスが低く、多くのビデオ メモリを消費します。開発者は FusedRMSNorm を実装できますが、開発者の要件は高く、コストも高くなります。

ニューラル ネットワーク コンパイラ テクノロジを使用すると、高度な柔軟性と使いやすさを維持しながら、大幅なパフォーマンスの向上を達成できます。 A100 プラットフォームでの RMSNorm オペレーターの次のパフォーマンス テスト結果は明確な証拠です。Python 開発インターフェイスの組み合わせを使用した実装と比較して、コンパイルされ最適化されたオペレーターは、手動オペレーターと統合されている場合でも 4 倍高速に実行されます。比較すると、14% のパフォーマンス向上も達成されました。この結果は、フライパドルフレームの柔軟性とパフォーマンスの理想的なバランスを十分に実証しています。

このため、Feipiao はニューラル ネットワーク コンパイラ技術を重要な研究開発の方向性と考えています。以下は Feipiao コンパイラの全体的なアーキテクチャ図です。



プレゼンテーション層では、PIR の拡張機能を利用して、CINN フロントエンド モジュールが実装され、演算子の分割、再計算、サブグラフの分割、次元導出モジュール、その他のモジュールを含む層関連の変換を処理し、最終的に複数のコンパイラ バックエンドを取得します。最適化されたサブグラフを生成します。コンパイラ バックエンドでは、これらの融合可能なサブグラフに対して、コンパイラはさらに Compute 関数を呼び出して、それらを抽象構文ツリー (AST) で構成される低レベルの中間表現 (IR) に変換し、これに基づいてループを実行します。カーネルに統合できることを確認するため、CINN の基礎となる IR 上でパフォーマンス チューニング分析が実行され、最適な構成が得られます。最後に、基礎となる IR がさらに慎重に特定のコード実装に変換されます。

生成大規模言語モデル Llama とヴィンセント グラフ モデル Stable Diffusion の実験結果では、コンパイラの最適化テクノロジを使用することにより、手動によるパフォーマンスの最適化を行わない基本バージョンと比較して、推論速度がそれぞれ 36% および 30% 高速になることが示されています。

動的および静的な統合と自動並列化

なぜ自動並列処理を行うのでしょうか?

大規模モデルの現在の主流のトレーニング方法では、さまざまな並列戦略が使用されています。これらの並列戦略は、動的グラフ モードで実装された「手動」並列手法、つまり単一カードに基づくセグメンテーションの手動処理に基づいています。 Tensor のセグメント化、計算グラフ)、通信 (通信演算子の追加)、ビデオ メモリの最適化 (ビデオ メモリの共有、再計算)、スケジューリングの最適化 (パイプライン オーケストレーション、非同期計算と通信) などの戦略に精通している必要があります。モデルの構造だけでなく、並列戦略とフレームワークについても深く理解しています。スケジューリング ロジックにより、大規模なモデルの開発とパフォーマンスの最適化が非常に高度になります。モデル アルゴリズムの革新を担当する専任のアルゴリズム チームに加えて、モデルの並列最適化を担当する専任のチームも必要です。これは、大規模なモデルの革新と反復に多くの障害をもたらします。

大規模モデル開発とシングルカード ロジックの違いを説明するために簡単な例を見てみましょう。並列戦略により Tensor ランタイムの形状が変化するため、形状処理に関連するオペレーターは並列戦略の影響を受けるかどうかを考慮する必要があります。以下の形状変更処理に示すように、セグメンテーション戦略により入力形状が変換されるため、出力形状はセグメンテーション戦略に従って合理的に調整する必要があります。



この目的のために、動的条件と静的条件を統合する自動並列スキームを提案します。開発者は少量のテンソル セグメンテーション アノテーションのみを必要とし、フレームワークはすべてのテンソルと演算子の分散セグメンテーション ステータスを自動的に取得し、適切な通信演算子を追加して、最終的にはモデル構造に基づいて結果の正確性を確保できます。クラスタ情報は、グラフィックス メモリおよびスケジューリング レイヤの最適化と組み合わせて、最も効率的な分散並列戦略を自動的に見つけます。

自動並列設計では、開発者は少量のテンソル セグメンテーション アノテーションのみを必要とします。セグメンテーション メソッドを抽象化し、テンソルのセグメント化 (パラメーター、入力) と計算グラフのセグメント化 (パイプライン) の 2 種類のセグメント化メソッドを必要とします。これら 2 種類のセグメンテーション方法を実装するには、フレームワークに分散テンソルとコンピューティング デバイスの間のマッピング関係を記述するメカニズムが必要です。そのために、ProcessMesh と ProcessMesh が GPU カードにマップするという 2 つの分散概念を導入します。プロセスは、複数のデバイスを、複数のプロセスで構成される 1 次元または多次元の配列にマップします。次の図は、8 つのデバイスで構成される 2 つの異なる ProcessMesh 抽象表現を示しています。



Placements は、Replicate、Shard、Partial の 3 つの分散タグで構成されるリストであり、その長さは、対応するコンピューティング デバイスの次元で分散テンソルを分割するためにどの分散タグが使用されるかを示すために使用されます。配布される 3 つのタグの詳細な説明は次のとおりです。

以下の図に示すように、Replicate は、テンソルが異なるデバイス上に複製の形で存在することを意味し、Shard は、テンソルが特定の次元に従って異なるデバイス上に分割されることを意味し、Partial は、デバイス上のテンソルが不完全であることを意味します。 Reduce Sum または Reduce が必要です。完全な状態は、さまざまな方法で Mean およびその他の操作を行った後にのみ取得できます。



分散タグの抽象化が完了したら、次を呼び出します。
paddle.distributed.shard_tensor() インターフェイスは、テンソル シャーディングのマーキングを実装します。テンソル スライスのマーキングと自動導出により、複雑な分散ハイブリッド並列処理を表現できます。次の図は、データ並列処理、テンソル モデル並列処理、パイプライン並列処理から構成されるハイブリッド並列処理の具体例を示しています。



次のコードは、混合並列処理の具体的な例を示しています。



自動並列開発アプローチを採用することで、開発者は複雑な通信ロジックを考慮する必要がなくなりました。 Llama タスクを例にとると、分散トレーニング コア コードの量が 50% 削減され、それによってグローバル分析やその他の最適化の助けを借りて開発の難易度が大幅に軽減されたことがわかります。 、パフォーマンスも動的グラフの手動並列化のパフォーマンスよりも優れています。

将来的には、テンソル分割マーカーを使用しない完全自動並列処理をさらに検討し、開発者がスタンドアロン コードを記述するのと同じように分散コードを記述できるようにし、大規模モデルの開発エクスペリエンスをさらに向上させます。

産業上の利点

一般に、Flying Paddle の新世代フレームワーク - Flying Paddle Framework 3.0-Beta は、大規模モデルおよび異種マルチコア向けに特別に設計されており、異種マルチコアに下方適応し、大規模モデルをサポートする上方統合の可能性を完全に解放します。モデルのトレーニングと推論。同時に、統合された動的および静的自動並列化、自動コンパイラ最適化、統合された大規模モデルのトレーニングとプッシュ、および大規模モデルのマルチハードウェア適応という 4 つの主要な機能を備えており、業界にサービスを提供する能力を包括的に向上させます。

統合された静的および動的自動並列化: この機能により、産業の開発とトレーニングのコストが大幅に削減されます。ユーザーは、単一カード ベースで少量のテンソル セグメンテーションをマークするだけで済みます。フライング パドル フレームワークは、分散セグメンテーション情報の導出を自動的に完了し、ロジックの正確性を保証するために通信演算子を追加します。同時に、モデル構造とクラスター情報に基づいて、ビデオ メモリとスケジューリング層の最適化と組み合わせることで、Flying Paddle は最も効率的な分散並列戦略を自動的に見つけることができるため、ハイブリッド並列トレーニングの開発コストを大幅に削減できます。開発者はイノベーションのモデルとアルゴリズムにもっと集中できるようになります。

コンパイラの自動最適化: この機能により、パフォーマンスの最適化のコストが大幅に削減されます。 Fei Paddle のコンパイラーはフレームワークと統合されるように設計されており、生成モデルや科学技術計算モデルなどのさまざまなモデルの効率的なトレーニングと可変形状推論をサポートし、コンピューティングの柔軟性と高いパフォーマンスのバランスを実現します。演算子とコード生成技術の自動融合により、Llama2 や安定拡散などの生成モデルの推論性能が 30% 以上向上しました。

大規模モデルの統合トレーニングとプロモーション: この機能は、業界に究極の開発エクスペリエンスを提供します。これにより、トレーニング機能と推論機能を相互に再利用できるようになり、大規模モデルのプロセス全体に統合された開発エクスペリエンスと究極のトレーニング効率が提供されます。動きから静止に移行することで、トレーニングと推論の作業をシームレスに接続できます。 RLHF (ヒューマン フィードバックによる強化学習) トレーニング プロセス中の生成計算は推論の最適化に再利用でき、2.1 倍の高速化を実現します。同時に、推論および定量化シナリオ再利用トレーニングのための分散自動並列戦略の効率が 3.8 倍向上しました。

大規模モデルのマルチハードウェアへの適応: Flying Paddle の重要な機能の 1 つは、異種マルチコアに適応し、ハードウェアの可能性を最大限に引き出すことです。アクセス メカニズムに関しては、フライング パドルはシンプルで効率的な抽象インターフェイスと基本的なオペレーター システムを提供し、適応コストを削減します。動作メカニズムに関しては、スケジューリング、ストレージ共有、その他のメカニズムを最適化し、スケジューリング効率を向上させます。オペレーター カーネルの観点から、Feipiao は、エンドツーエンドのパフォーマンスを向上させるコンパイラー自動フュージョン チューニング ソリューションを提供します。同時に、Feipiao は、新しいハードウェア メーカー向けに、コード統合、継続的統合、モデル回帰テストなどの研究開発インフラストラクチャも構築しました。これらのメカニズムにより、新しいハードウェアが Feipiao の通常のリリース システムに確実に含まれるようになり、ユーザーはコンパイルせずに直接インストールして試すことができます。 Flying Paddle の完全な機能と低コストのアクセス メカニズムにより、ハードウェア メーカーは、合計 25,000 を超えるコミットを含む 3,456 の PR を Flying Paddle に共同で提供するようになりました。

これは Fei Paddle の新世代フレームワーク 3.0 です。現在、3.0 ベータ版が開発者に公開されており、すべての開発インターフェイスは 2.0 と完全に互換性があります。開発者は使用してフィードバックを提供することを歓迎します。