[51CTO.com からのオリジナル記事] ディープラーニングは、データを表現する学習に基づいた機械学習の手法です。手動で設計された機能に依存する従来の機械学習アルゴリズムとは異なり、ディープラーニングはさまざまなタスクに基づいてデータ機能を自動的に学習できます。 ディープラーニングは音声、画像、ビデオ処理において目覚ましい進歩を遂げてきましたが、実行するには通常、強力なコンピューターが必要です。それが携帯電話に登場したらどうなるでしょうか? 2017年12月1日から2日にかけて、51CTO主催のWOTDグローバルソフトウェア開発技術サミットが深セン中州マリオットホテルで盛大に開催されました。 このサミットのテーマはソフトウェア開発です。ソフトウェアパフォーマンス最適化に関する特別セッションでは、黄文波氏が「モバイル端末におけるディープラーニングの最適化実践」と題した基調講演をゲストと共に行い、モバイル端末におけるディープラーニングモデルの設計や最適化戦略などの問題について詳しく説明しました。 議論は以下の3つの側面から構成されました。
ディープラーニングを最適化する理由は何ですか? 近年、ディープラーニングは非常に人気がありますが、計算量が膨大であるため、対応するモデルは簡単に数百メガバイトにも達することがあります。 1 つのアプリに数十メガバイトのスペースしか割り当てられない携帯電話にディープラーニングを導入するには、アルゴリズム レベルでモデルのサイズを大幅に削減する必要があります。 過去 2 年間のディープラーニングの開発傾向は、ほとんどのアプリケーションをクラウドに配置することであり、使用されるデバイスは一般的に GPU です。 しかし、本当に AI を実現したいのであれば、クラウド アルゴリズムだけに頼るのは不十分です。一部のアプリケーション シナリオでは、計算をローカルで実行する必要があるためです。 たとえば、Apple の Face ID がクラウドにのみ保存される場合、携帯電話の信号が失われると、ユーザーは携帯電話を使用できなくなるのではないでしょうか。 同様に、自動運転では、車外の人や信号機の認識など、外部環境にタイムリーに対応する必要があります。ネットワークに遅延があれば、交通事故は発生しないのでしょうか?したがって、多くのアプリケーションでは計算をローカルに配置する必要があります。 Mogujie がディープラーニングの最適化を行うのはなぜですか?主な理由は次のとおりです。
たとえば、Alpha GO ではチェスのゲームをプレイするために 1,920 個の CPU と 280 個以上の GPU が必要で、電気代は約 3,000 ドルになります。同様に、Mogujie が GPU を使用しても、その電気代は数万元になります。
CNN(畳み込みニューラルネットワーク)の基礎 画像処理におけるディープラーニングの概念は、フィルタリングとスクリーニングの層を経て、最終結果が得られるというものです。 典型的なプロセスは次のとおりです。入力 (INPUT) は、畳み込み層 (CONV) と活性化層 (RELU) を介して特徴抽出され、次にプーリング層 (Polling) を介して圧縮および次元削減され、最後に全結合層 (FC) によってすべての特徴が接続され、画像が特定のタイプに属する確率が出力されます。 上図に示すように、複数のレイヤーの処理を経て、最終的に左側の画像が車に属する可能性が最も高いと結論付けられ、車であるとみなすことができます。 この例ではレイヤーは約 10 個しかありませんが、実際のシナリオではレイヤーの数ははるかに多く、最大 100 個を超えることもあります。 上記のシンプルな画像の認識では、実際に CNN によって何億回もの計算が行われ、ようやく結果が得られました。 ディープラーニングアプリケーションの課題 ディープラーニング分野の発展傾向は、ネットワークがますます深くなり、ビッグデータによって駆動されるデータが急増するにつれて、トレーニング結果の精度がますます高くなることです。 ネットワークが深くなるにつれて、ディープラーニング モデルがどんどん大きくなり、計算に必要なリソースがどんどん増えるという問題が発生します。 同時に、携帯電話はサーバーのような強力な GPU を使用できないため、コンピューティング パフォーマンスは制限されます。 また、携帯電話のCPUやバッテリー容量は当面超過できないため、それに応じて消費電力も制限される。 モバイル端末でのディープラーニングの最適化実践 2種類のモデル圧縮 モバイル フォンにディープラーニングを導入する方法は 2 つあります。
モデル圧縮 アルゴリズム レベルでモデルを圧縮するには、主に 3 つの方法があります。
刈り込み方法は比較的直感的です。その考え方は、ニューラル ネットワークをトレーニングするときに、各ニューロンに重みがあり、その重みは大きくても小さくてもよいというものです。重量が小さいほど、最終結果への影響は小さくなります。 そのため、2015年に研究が初めて開始されたとき、最終結果に影響を与えずにこれらの小さな重みを取り除くことを提案する人もいました。 前述の「重量を減らす」という方法は、記憶に非常に悪影響を及ぼします。たとえば、畳み込みに 3×3 行列がある場合、その一部だけが切り取られると、実際の計算は切り取られた部分に対して行われる必要があり、メモリの不連続が発生します。 そのため、より良い結果を得るために、フィルターを完全にカットオフし、3×3 全体をカットオフしてからトレーニングすることを提案する人もいます。 2017 年に、各チャネルにスケール係数を追加してネットワークをトレーニングし、その後、より小さなスケール値を持つすべての畳み込みをカットオフすることを選択して (上の図のオレンジ色で示すように)、効率的なメモリ操作を容易にするという提案がありました。 ネットワークを切り刻む代わりに、量子化することでネットワークを小さくすることができます。上図に示すように、3×3 の重みは実際には浮動小数点数 (Float) として保存され、各浮動小数点数を保存するには 32 ビットが必要です。 したがって、量子化の考え方は、これら 9 つの浮動小数点値を 4 つのカテゴリにクラスタ化することであり、浮動小数点数を保存するときは、これら 4 つの浮動小数点数のみを保存すれば済みます。 これらの値を表現するには Index を使用できます。ここでは 4 つのクラスターがクラスター化されているため、インデックスを表現するには 2 つだけ必要です。つまり、2 の 2 乗はちょうど 4 であり、ちょうど 4 つの数値を表現できます。 おそらく誰もがデータ構造を勉強するときにハフマン符号化について学んだことがあるでしょう。ある重みは他の重みよりもはるかに頻繁に発生するため、より頻繁に発生する重みをエンコードするのに使用するビット数が少なくなるという考えです。 出現頻度の低い重みについては、より大きなビットを使用して表現されます。この方法では、全体のインデックスがわかっている場合に、固定数のビットで角度を直接保存できるため、スペースを節約できます。 モデル圧縮のプロセスは、チャネルレベルの重みプルーニングを実行する → 重みを量子化する → 重みをいくつかの固定クラスにクラスタ化する → ハフマン符号化によって量子化されたインデックスをさらに圧縮することです。 ネットワークの設計 もう一つの圧縮のアイデアは、小さなネットワークを設計することです。これには主に次の 3 つの方法があります。
SqueezeNet の核となる考え方は、次の 3×3 畳み込みを行う前に 1×1 畳み込みを実行し、前の 64 次元を 16 次元に削減し、この 16 次元に基づいて 3×3 畳み込みを実行することです。 これは、3×3 畳み込みを 4 分の 1 に縮小することと同等であり、モデルを元のサイズの 4 分の 1 に縮小することを意味します。 Googleは2017年3月に、より小規模なモデルであるMobileNetsを提案した。これは主にグループ戦略を採用しており、その中心となる考え方は、以前のすべてのレイヤーで動作するのではなく、対応する以前のレイヤー チャネルとの畳み込みのみを実行するというものです。 たとえば、前の重みは 3×3×32 であり、前の 32 チャネルで乗算すると、2 つの 32 乗算になります。 グループを使用すると、後続の乗算は 1 (各チャネルに乗算) となり、元の値の 32 分の 1 になるので、必要なのは 32 の 1 つだけです。 チャンネル数が 512 など大きい場合、チャンネル数は 512 減少しますが、これは非常に重要です。 2017 年 7 月、Face++ チームはさらなるアプローチである ShuffleNet を提案しました。チャネルが大きい場合、1×1 畳み込みから 1024 または 2048 への計算量も非常に大きくなることを考慮すると、1×1 畳み込みに対してもグループ操作を実行します。 グループ化後、1×1 畳み込みを個別に実行し、順序をシャッフルします。このようにして、チャネル間の関係を表現することができます。 これは、公開データセット ImageNet でのデータセット実験です。モデル圧縮後、モデルの元のサイズは 98M から 49M に削減され、重み量子化後にはさらに 15M に削減されました。 プロセス全体を通じて、トップ 1 率は 75% から 72.4% に低下しましたが、これは比較的小さな低下です。業界全体の精度率は 75% から 76% の間です。この実験は非常に印象的で、実用的であることがわかります。 上図の結果は、Mogujie 自身の実際のデータに基づいています。現在のデータ サンプルは約 1,200 万です。「プルーニング」後、トップ 1 は基本的に 48% のままです。 トップ 5 は 82.2% から 81.5% に 1 ポイント低下しましたが、モデル サイズは 86M から 31M に減少しました。同時に、推論時間は 45 ミリ秒でした。つまり、効率が2倍になったということです。 もう一つの試みは、セマンティックセグメンテーションネットワークです。 Mogujie は、手、足、靴、衣服、ズボンなど、衣服の特徴に基づいて人体のさまざまな部分を「セグメント化」しました。このセマンティックセグメンテーションモデルの基本ネットワークはMobileNetであり、最終モデルはわずか13Mです。 モバイル端末の最適化実践 モデルを十分に小さくした後、それを携帯電話で実行できるようにするにはどうすればよいでしょうか? 携帯電話でディープラーニングを行う場合、計算量が多いため、トレーニングを携帯電話に任せるのではなく、GPU に実装させる必要があります。トレーニングが完了したら、モデルを携帯電話に展開します。 現在業界で一般的に使用され、使いやすいディープラーニング フレームワークには、次のものがあります。
では、ネットワークの場合、推論をトレーニング ネットワークと同じにする必要がありますか?これはまさに、NCNN や MDL など、今日の業界のほとんどのフレームワークの実践であり、トレーニングされたネットワークを携帯電話に直接転送して操作します。 しかし、トレーニング中は勾配計算とバックプロパゲーションを実行する必要があるのに対し、推論中は実際にはバックプロパゲーションを実行する必要がないことがわかりました。 上の図は、畳み込みから BN (BachNormalization)、Relu までの典型的な CNN ネットワークの 1 つのブロックを示しています。 これら 3 つのレイヤーは保存時に大量のメモリを必要とします。実際には、これらを 1 つのレイヤーに結合してメモリ使用量を削減し、プロセスを高速化することができます。 具体的な実装プロセスでは、フレームワークコードを変更せずに BN を Convolution に組み込みました。ただし、Relu を Convolution に組み込む場合は、このフレームワークのソース コードを変更する必要があります。 畳み込み計算の最適化 ディープラーニングで画像を処理する際の計算のほとんどには畳み込みが含まれるため、より直感的なアプローチは 3×3 フィルターを直接実行することです。 データや画像はメモリ内に連続的に保存されるため、読み取り時にさまざまな場所にジャンプする必要があり、ポインタスパンが大きくなり、キャッシュヒット率が大幅に低下します。 したがって、ほとんどの畳み込みアルゴリズムの最適化は、フィルタ乗算を従来の行列乗算に変換することによって行われます。上図の右側に示すように、元の 7x7 行列と 3x3 行列は、それぞれ 25×9 行列と 9×1 行列に変換されます。 大きな行列を直接乗算することで結果を得ることができ、結果は元のものとまったく同じになります。これは、行列演算用の多くの高速化ライブラリで一般的に使用されている最適化方法でもあります。 MEC アルゴリズムは 2017 年に開始されました。元の 7×7 行列から 25×9 への変換率には冗長性と重複があるため、アルゴリズムはそれを 5×21 に変換します。桁違いに言えば、5×21 は 25×9 に比べてメモリ使用量が約半分に削減され、パフォーマンスもより直感的になります。 浮動小数点計算 固定小数点計算 ディープラーニングモデルの重みと特徴マップの値は浮動小数点数であり、コンピュータの浮動小数点計算能力は固定小数点計算に比べてはるかに劣るため、たとえば、3 + 2と3.0 + 2.0を計算する速度は明らかに異なります。そのため、渡された浮動小数点数をまず固定小数点数に変換する必要があります。 たとえば、重みのほとんどが 0.1 または 0.2 の場合、最小値と最大値を見つけて 0 から 2 にマッピングします。0 から 2 はちょうど 1 バイトなので、1 つの 8 ビットで表現できます。 このように、畳み込み行列の乗算を計算するときに、典型的な行列を直接使用して計算を実行できるため、浮動小数点数を使用するよりもはるかに高速になります。 もちろん、計算が完了した後も、結果を浮動小数点数に変換して出力する必要があります。 上で述べた畳み込みを最適化するコアメソッドに加えて、他にどのように進化できるでしょうか?
二次開発中は、前述のアルゴリズムを使用せずに、提供される基本的な畳み込み演算を直接呼び出すことができます。
たとえば、上に挙げたネットワークの多くは 1×1 畳み込みまたは 3×3 畳み込みのいずれかであり、2×2 畳み込みは基本的に存在しません。 したがって、3×3 畳み込み最適化のみを使用する必要があります。 Tencent NCNN が採用した特定の畳み込み戦略と同様に、3×3 畳み込みと 1×1 畳み込みのみが最適化されます。また、行列を乗算する他の方法を考慮する必要がないため、実装速度が向上します。 詳細な分析により、Tencent と Baidu は Android で同様の結果を示していることがわかりました。前述したように、Tencent は 3×3 および 1×1 の最適化に特定の畳み込みを使用するのに対し、Baidu は一般的なアプローチを使用するため、後者の方がメモリを多く消費します。 もちろん、どちらもパフォーマンスは 200 ミリ秒程度です。オープンソースの Tensorflow Lite については、浮動小数点型を整数型に変換して計算するため、パフォーマンスは上記 2 つよりも高速になり、85 ミリ秒しかかからず、基本的にリアルタイム要件を満たすことができます。 ディープラーニングについては、Apple は 2017 年に CoreML をリリースしました。インターネット上で非常に人気があります。そのフレームワークは上図の通りです。一番下にはBNNSという層が分化しており、高速化を担っています。C言語で書かれた機械学習ライブラリです。 その隣にある Metal Performance Shaders は Apple 独自のハードウェアに属しており、機械学習に関連する基礎となる API をカプセル化しています。 二次開発者は、CoreML の基盤に基づいて適切なアプリケーションの追加を行うことができます。しかし、以下の理由により CoreML を採用しませんでした。
そのため、iOS では MPSCNN レイヤーに計算畳み込みを実装しており、次のような利点があります。
同時に、次の2点に注意する必要があります。
半精度計算の精度に疑問を抱く人もいるかもしれませんが、ディープラーニングは一般化能力が非常に強いため、計算精度が低下しても影響は基本的に大きくなく、タスクを完了することができます。 上の写真はAppleのMPSCNNの設計コンセプトを示しています。他の一般的なフレームワークの構成構造とは異なり、重みは 4 の整数倍のチャネルに格納されます。 たとえば、3 つのスライスを使用する必要がある 9 つのチャネルがある場合、最後のスライスでは 1 つのチャネルのみを保存する必要があり、他の 3 つのチャネルはスペースを予約するために空きになります。したがって、この核心的なポイントを理解することは、開発プロセスをスピードアップするのに役立ちます。 上の図に示すように、Metal を使用して新しいレイヤーを開発し、すでに特定のアルゴリズムの基盤がある場合は、上記の数行のコードだけで十分です。 上図の NCNN と Apple MPSCNN の比較によると、オープンソース フレームワークを使用した場合の CPU 時間は 110 ミリ秒であるのに対し、Apple の場合は半分以下の 45 ミリ秒にとどまっています。確かにAppleの効果は良いことがわかります。 独自のディープラーニング フレームワークを構築する場合は、次の戦略的側面に注意する必要があります。
NCNNベースのツールキットフレームワーク Mogu Deep Learning Toolkit は、Mogujie が 2016 年に社内使用のみを目的として開発したディープラーニング ツールキットです。 各レイヤーは極めて専門的に作られているため、高い凝集性と低い結合性により、ネットワーク設計の柔軟性が非常に高まり、専門家にとって使いやすくなります。 このツールキットの設計思想は、トレーニング ネットワークの最適化に基づいて、携帯電話のネットワークからの画像用のネットワーク モデルを作成し、それを初期化し、フロントエンドの伝播を通じて推論を実行し、特定のタスクの伝播結果に対して分類、検出、セグメンテーションなどの操作を実行し、結果を取得するか、他のビジネスと組み合わせるというものです。 上の図は、C++ で実装されたツールキットを使用して開発された単純なケースです。これは MobileNet のクラスです。すべてのレイヤーを Private に配置します。外部インターフェイスは 1 つだけであり、その結果は初期化を通じて取得できます。 ここでの入力は画像であり、最終的な出力は画像の認識結果です。 ディープラーニングの最適化をビジネスに応用する試み 上の写真は実際の戦闘の一部を示しています。
画像内の人物をセグメント化することで、髪の毛、衣服、バッグ、靴、脚、手などのさまざまな部分を区別し、さらに分析を行いました。 消費される時間も約 40 ミリ秒とかなり長くなります。 上の画像の左側には、別のトレーニング モデルである首輪の形状認識が表示されています。画像認識技術により、Tシャツが丸首かVネックか、長袖かノースリーブかがわかります。下の行から判断すると、丸襟である確率は66.7%です。 上の写真の右側は、弊社の社内コミュニケーションツールです。携帯電話にインストールしてローカルで実行し、ディープラーニングの結果に基づいて画像分類を行うことができます。 要約する モバイルデバイスにディープラーニングを実装するには、アルゴリズムとエンジニアリングを組み合わせる必要があります。
Mogujie の画像アルゴリズム エンジニアである Huang Wenbo 氏は、主にモデル加速圧縮、GAN、芸術スタイル変換、顔関連のアプリケーションなど、ディープラーニング関連の業務に従事しており、特にモバイル端末でのディープラーニングの最適化について深く研究しています。 [51CTO オリジナル記事、パートナーサイトに転載する場合は、元の著者とソースを 51CTO.com として明記してください] |
<<: がん治療への新たな希望:AIが科学者の生きた人間の細胞の観察を向上
>>: 今後の国内人工知能産業の発展における5つの大きなトレンド
[[242009]]この記事の著者は、Microsoft Internet Engineering...
この記事はLeiphone.comから転載したものです。転載する場合は、Leiphone.com公式...
[51CTO.comより] 中国共産党第19回全国代表大会で「インターネット、ビッグデータ、人工知能...
コア分析コンテンツ初心者および中級の Android 開発者にとって、学ぶべき Android の理...
弱い人工知能の時代が到来し、人々の日常生活はアルゴリズムが提供するサービスと切り離せないものとなって...
機械学習は受け入れるのが難しいものです。事件があったらいいな、じゃあ行こうよ〜 Q: 機械学習とは何...
企業がデータを活用するディープラーニング (DL) プロジェクトに着手する場合、そのデータを保護する...
[[421250]]この記事はAI新メディアQuantum Bit(公開アカウントID:QbitA...
ChatGPTが登場して以来、長い間息をひそめていたGoogleも、モバイル検索に力を入れ始めていま...
2019年2月、ポーランド政府は銀行法に改正を加え、信用判定に否定的な結果が出た場合に顧客に説明を求...
日本の独立系開発者佐藤氏はアスペルガー症候群のため学校を中退、退職。その後独学でAIを学び、AI画伯...
事実は、データ技術の進歩と発展により、仮想カードと電子ウォレットが支払い管理により適したものになって...
執筆者:Qianshan過去 1 か月間、OpenAI に関する物議を醸す報道が多くありました。一方...