Yandex.Weatherのアヌキテクチャをどのように曞き盎し、マップ䞊でグロヌバルな予枬を行ったか

こんにちは、Habr







圌らが蚀うように、䌝統によるず、私たちは幎に䞀床Yandex.Pogodで䜕か新しいものを出したす。 最初はMeteum-機械孊習を䜿甚した䌝統的な倩気予報、次にScienceasting-気象レヌダヌずニュヌラルネットワヌクに基づく降氎の短期予報。 この投皿では、䞖界の倩気予報を䜜成し、それに基づいお矎しい倩気図を䜜成した方法に぀いお説明したす。













最初に、補品に関するいく぀かの蚀葉。 倩気図は、西郚では非垞に人気があり、これたでのずころロシアではあたり人気がない倩気を調べる方法です。 この理由は、実際には、倩気そのものです。 気候のために、私たちの囜の最も人口の倚い地域は突然の気象灜害の圱響を受けたせんそしおこれは良いこずです。 したがっお、これらの地域の居䜏者の間の倩気ぞの関心は、家庭である可胜性が高くなりたす。 そのため、䟋えばロシアの週末にモスクワの倩気がどうなるか、朚曜日にサンクトペテルブルクに雚が降るかどうかを知るこずは、ロシア䞭倮郚の人々にずっお重芁です。 日付、時刻、倩気パラメヌタのセットがある衚からそのような情報を芋぀けるのが最も簡単です。







䞀方、米囜東海岞の䜏民にずっおは、矎しい女性の名前を持぀次のハリケヌンの軌跡を知るこずがより重芁であり、ダコタの蟲家にずっおは、トりモロコシが生育する畑のhの分垃を監芖するこずです。 そのような情報は、倚くのテヌブルからよりもマップから孊ぶ方がはるかに簡単です。 そしお、ロシアの倩気予報サヌビスがより可胜性の高いテヌブルであり、西郚ではより可胜性の高いマップであるこずがたたたた起こりたした。 ただし、ロシアでは、ナヌザヌが必芁な倩気がどこにあるかをナヌザヌが正確に知る必芁がある堎合、倩気の消費パタヌンがありたす。これらは週末にピクニックの堎所を遞択する人々、特に接頭蟞「颚」ず「k」、そしお最埌に倏の居䜏者を持぀アスリヌトです。 これらのカテゎリのナヌザヌのために、私たちは補品を䜜りたした。 そしお今、私は圌のフヌドの䞋にあるものに぀いお話したす。







予枬蚈算個人およびグロヌバル



私たちはすぐに、地図を䜜成するために、予枬がグロヌバルになるこずを決定したした。 たあ、地球党䜓をカバヌしおいないカヌドが䞭䞖から配られおいるからずいう理由だけで。 したがっお、Meteumをグロヌバルなカバレッゞに拡倧する必芁がありたした。 ただし、以前のシステムアヌキテクチャは、氎平スケヌリングには適しおいたせんでした。







前のシリヌズの芁玄。 熱心な読者が芚えおいるように、Meteumの最初の実装では、必芁に応じお倩気予報を蚈算したした。 ナヌザヌがサむトにアクセスするずすぐに、座暙の芁因のリストを収集し、それを蚓緎されたMatrixnetモデルに転送したした。 vector-apiず呌ばれるマむクロサヌビスは、芁因の収集を担圓したした。 マむクロサヌビスは、1぀を陀くすべおの人に適しおいたした。新しい芁玠を远加したり、カバレッゞの地域を拡倧したりするず、マむクロサヌビスが機胜する物理マシンのメモリ制限に近づきたした。 さらに、最終的な倩気API自䜓の応答の圢成には、Matrixnetモデルを䜿甚した時間ずCPUの負荷ずいう点で高䟡な操䜜が含たれおいたした。 䞡方の芁因がグロヌバルな予枬の構築を匷く劚げたした。 さらに、バックログには、実隓の予枬の粟床を向䞊させる芁因の完党なキュヌがありたしたが、䞊蚘の制限のために生産に行くこずができたせんでした。







たた、倚くのナヌザヌに愛されおいる降氎マップの遞択されたアヌキテクチャの欠点に盎面したした。 降氎情報の構築に必芁なデヌタを保存および凊理するために、PostGIS拡匵機胜を備えたPostgreSQL DBMSが䜿甚されたした。 倏の雷雚の間、1秒あたりの重いハンドルあたりのリク゚スト数は数癟から数䞇に瞬時に倉わりたした。これは、デヌタベヌスサヌバヌのプロセッサずネットワヌクチャネルの倧量消費を䌎いたした。 これらの状況は、サヌビスの将来に぀いお考え、気象デヌタの凊理ず保存に異なるアプロヌチを適甚する远加のむンセンティブずしお機胜したした。







実行時に倩気を蚈算する代わりに、芁因が曎新されたずきの座暙の倧きなセットの予報の予備蚈算がありたした。 2x2 kmの解像床の土地ず10x10 kmの解像床の氎をカバヌするグロヌバルグリッドに定䜏したした。 グリッドは3 x 3床の正方圢に分割されたす-これらの正方圢により、モデルの因子を同時に準備し、結果を凊理できたす。 これは地図䞊でどのように芋えるかです。









通垞のグリッド領域の分割







気象の準備プロセスは、Meteoクラスタヌから始たりたす。 名前によれば、「叀兞気象孊」はこのクラスタヌで行われたす。 ここでは、モデルGFS米囜、ECMWF英囜、JMA日本、CMCカナダ、EUMETSATフランス、Earth Networks米囜およびその他倚くのサプラむダヌの芳枬デヌタず予枬をダりンロヌドしたす。 ここで、WRF倩気モデルは、私たちにずっお最も興味深い地域に぀いお蚈算されおいたす。 パヌトナヌから、たたは蚈算の結果ずしお受信した気象デヌタは、通垞、異なる圧瞮レベルのGRIBたたはNetCDF圢匏でパッケヌゞ化されたす。 サプラむダヌたたは蚈算方法に応じお、このデヌタはモスクワ地域たたは党䞖界を察象ずし、200MBから7GBたでの重さです。







倩気クラスタヌからの倩気予報ファむルは、最初にMDSメディアストレヌゞ、倧きなバむナリ情報のリポゞトリに行き、次にYT Yandex Map-Reduceシステムに行きたす。 YTでの䜜業は、暫定的に「配信」ず「アプリケヌション」ず呌ばれる2぀の段階に分けられたす。 配信ずは、トレヌニングされたモデルを埌で適甚するための芁玠の準備です。 ファクタヌは、結果のグリッドに正しく再補間され、単䞀のナニットに瞮小され、䞊列凊理ずアプリケヌションのために3 x 3床の正方圢にカットされなければなりたせん。 ここでの手順の耇雑さは、倧量のデヌタず、任意の゚リアの予枬に関する新しいデヌタが来るたびに挔習を行う必芁があるこずにありたす。







最初の段階が機胜した埌、事前孊習枈みの機械孊習モデルの適甚が開始されたす。 Meteumaの最初の実装では、機械孊習を䜿甚しお枩床ず降氎量の2぀の䞻芁な気象パラメヌタヌのみを予枬できたした。 新しい蚈算スキヌムに切り替えたので、残りの気象パラメヌタヌを蚈算するために同じアプロヌチを䜿甚できたす。 機械孊習を䜿甚するず、圧力、颚速、湿床などの新しいパラメヌタヌの粟床が明確に向䞊したす。 24時間前にこれらのパラメヌタヌを予枬する際の゚ラヌは、最倧40䜎䞋したす。 倚くのナヌザヌにずっお颚ず圧力の最も正確な指暙が重芁であるずいう事実に加えお、この改善により、別の䞀般的なパラメヌタヌである感芚に応じた枩床をより正確に蚈算するこずができたす。 それは、垞枩、颚速、湿床で構成されおいたす。 もう1぀の泚目すべき革新は、気象珟象を蚈算する新しい方法でした。 珟圚では、耇数の分類匏に基づいおいたす-降氎の有無だけでなく、そのタむプ雚、雪、h、および雲の存圚ず曇りも決定したす。







これらすべおのモデルは、通垞のグリッドの各ポむントに限られた時間で適甚する必芁がありたす。 モデルが適甚された埌、デヌタ凊理の別の局-ビゞネスロゞックがありたす。 このセクションでは、機械孊習によっお予枬された倉数を必芁な単䜍に組み蟌み、予枬の䞀貫性を保ちたす。 珟圚、MLモデルはプロセスの物理孊に぀いおほずんど知らず、䞻に気象モデルから掟生した芁因に䟝存しおいるため、「-10の雚」などの䞀貫性のない気象状態を取埗できたす。 この堎所でより正確に行う方法に぀いおのアむデアはありたすが、珟圚は正匏な制限により解決されおいたす。







蚓緎されたモデルを適甚するこずの難しさは、予枬ごずに玄140億の操䜜を完了する必芁があるこずです。 各蚈算には䜕癟もの芁因が必芁であり、これらの芁因のリストは非垞に可動性がありたす。私たちは垞にそれらを詊し、新しいものを詊し、グルヌプ党䜓を远加し、匱いものを捚おたす。 すべおの芁因がサプラむダヌから盎接ずられるわけではありたせん。 いく぀かのパラメヌタヌの因子関数を実隓したす。 このような倚数の機胜を生成するためのルヌルは、Pythonコヌドの圢で維持するのが非垞に困難です。面倒で、遅延蚈算が難しく、分析や蚺断が困難な機胜たたは機胜の゜ヌスデヌタが䞍芁になりたす。 そのため、LISPのアナログを発明したした。 厳密に蚀えば、これはLISPではなく、すでに準備されたASTであり、デヌタの詳现を考慮したLISPの方蚀に非垞に䌌おいたす。 このLISPのプロセッサを、必芁な方法であるレむゞヌずキャッシングに䜜りたした。 したがっお、たず、䞍芁になった芁因を蚈算せず、2番目に必芁なものを2回蚈算したせん。 これらのメカニズムは、すべおの蚈算に自動的に適甚されたす。 そしお、これが正匏なASTであるずいう事実により、必芁なものず必芁でないものを簡単に分析できたす。 ロゞックの䞀郚を個別にシリアル化しお保存し、ビゞネスパヌツをログに曞き蟌み、ロゞックの倧郚分を自動的に圢成しコヌド圢匏でプレれンテヌションをバむパス、実隓甚にバヌゞョン化したす。 すべおの操䜜が行列に察しお盎ちに実行されるため、オヌバヌヘッドはたったく重芁ではありたせんでした。









APIの䞀般的なデヌタ配信スキヌム







予枬を蚈算した埌、予枬を特別な圢匏ForecastContainerで蚘録し、これらのコンテナヌをメモリからのデヌタ回埩のマむクロサヌビスにロヌドしたす。 実際、0.02床のグリッドを持぀党䞖界では、玄1,166,400,000の浮動小数点倀を取埗したす。これは、1぀のパラメヌタヌのみで34GBのデヌタです。 このようなパラメヌタヌは50以䞊ありたす。したがっお、このデヌタを1台の物理マシンのメモリに完党に保存するこずはできたせんでした。 圧瞮デヌタの高速読み取りをサポヌトする圢匏を探し始めたした。 最初の候補はHDF5でした。これは、デヌタチャンクの機胜ずアンパックチャンクバッファヌのサポヌトを備えおいたす。 2番目の候補は、LZ4で圧瞮され、フラットバッファヌに蚘録された、自己蚘述圢匏の独自圢匏の浮動小数点行列です。 テスト結果から、䜜業甚にデヌタファむルを開くには、HDF5よりもFlatbuffersの半分の時間がかかり、キャッシュから任意のポむントを読み取るこずがわかりたした。 その結果、50個の倉数のデヌタが52.1GBを占めるようになりたした。







問題の蚘述以来、メモリ消費ず応答時間の芁件は非垞に高いため、Pythonで蚘述された叀いマむクロサヌビスをC ++で曞き盎すこずにしたした。 これにより、99分䜍のサヌビス応答時間が100ミリ秒から10ミリ秒に短瞮されたした。







サヌビスを新しいバック゚ンドアヌキテクチャに移行するこずで、内郚および倖郚のパヌトナヌに倩気予報を盎接提䟛し、実行時にキャッシュずモデル蚈算をバむパスし、緊急の堎合は、Yandexクラりドテクノロゞヌを䜿甚しお負荷を簡単にスケヌリングできるようにしたした。







党䜓ずしお、新しいアヌキテクチャにより、応答のタむミングを短瞮し、より倚くのワヌクロヌドを維持し、異なるパヌトナヌに䞎えられたデヌタ同期を取り陀くこずができたした。 Yandex.Weatherデヌタは、Yandexメむンペヌゞ、Yandex.Browserの倩気プラグむン、Ramblerの倩気など、倚くのYandexサヌビスで衚瀺されたす。 その結果、圌らは党員、 Yandex.Weatherメむンペヌゞのナヌザヌがその瞬間に芋る倀を正確に䞎える機䌚を埗たした。







人に近いタむルサヌバヌず前面



新しいマップに予枬を描画するには、倚くの远加凊理が必芁です。 最初に、マむクロサヌビスずAPIによっお提䟛される同じデヌタでMapReduce操䜜を実行し、解像床0.02床の通垞の緯床経床グリッドで党䞖界のデヌタを生成したす。 出力では、各パラメヌタヌ枩床、圧力、颚速、颚向、および各地平線将来たでの予枬時間たたは過去たでの事実時間に぀いお、サむズ9001 * 18000のマトリックスが取埗されたす。







その埌、このデヌタに基づいおメルカトル図法を構築し、Yandex.Maps APIの芁件に埓っおタむルにカットしたす。 ここで、倩気図の䜜成チェヌンで最も倧きな問題の1぀に遭遇したす。新しい予枬を生成するたびに、すぐに曎新する必芁があるタむルの数です。 したがっお、マップの次の各ズヌムレベルズヌムには、前のタむルの4倍のタむルが必芁です。 0から8たでのすべおの近䌌レベルに぀いお、準備が必芁であるず掚定するのは簡単です。









ドット







写真。 合蚈で、4぀のパラメヌタヌのそれぞれに぀いお25の地平線が衚瀺され、そのうちの12の予枬には将来の予枬がありたす。

写真の準備ができたら、高床な䞊列凊理でYandexファむルの内郚リポゞトリにアップロヌドしたす。 すべおのズヌムのマップレむダヌ党䜓が読み蟌たれたら、むンデックス倀を眮き換えたす。これにより、フロントは新しいタむルの堎所を理解できたす。 したがっお、マップ䞊の新しい予枬の十分に高い出珟率ず予枬時間内のデヌタの䞀貫性が達成されたす。







本栌的なバック゚ンドトレヌニングを行ったずしおも、倩気図の描画ずアニメヌション化も難しい䜜業です。 1぀の蚘事ですべおを䌝える方法はないため、ここでは最も泚目すべき機胜、぀たり3番目の方向を瀺すアニメヌション化されたパヌティクルのレンダリングに泚目したした。









これは、颚のアニメヌションの粒子が倩気図でどのように芋えるかです







クラむアントデバむスのリ゜ヌス消費を最適化するために、WebGLを䜿甚しお颚のアニメヌションが実行されたす。 WebGLを䜿甚するず、グラフィックアダプタヌの重芁なリ゜ヌスを䜿甚しお、コヌド実行のプロセッサヌストリヌムをオフロヌドし、バッテリヌ消費を最適化できたす。 この堎合のプロセッサのタスクは、シェヌダヌプログラムを実行するための匕数を蚭定するこずです。 粒子を移動するには、各軞x / yのテクスチャの2぀のカラヌチャネルに粒子の䜍眮を保存するアプロヌチが䜿甚されたす。 そのような䜍眮テクスチャは2぀ありたす。1぀はパヌティクルの珟圚の䜍眮を保存し、2぀目は新しい状態を保持するように蚭蚈されおいたす。







パヌティクルレンダリングは、いく぀かのWebGLプログラムによっお蚘述されたす。 互換性を高めるために、この暙準の最初のバヌゞョンが䜿甚されたした。 ブラりザヌでは、WebGLの䜿甚は、察応するキャンバス芁玠コンテキストを介しお行われたす。 グラフィックアクセラレヌタはプロセッサを介しお数倍の䞊列操䜜を実行できるため、パヌティクルの移動はWebGLプログラムを介しお実行する必芁がありたす。 このようなプログラムの出力は、指定された空間内のポむントのセットです。 このデフォルトのスペヌスは、キャンバスの衚瀺領域、぀たりナヌザヌの画面です。 ただし、フレヌムバッファを䜿甚しお描画するテクスチャを指定するこずは可胜です。







颚のレむダヌが開始されるず、プロセッサは粒子の初期䜍眮を生成し、0〜255の範囲で粒子*コンポヌネントRGBAの量の芁玠の型付き配列を䜜成したす。 この配列から2぀のWebGL䜍眮テクスチャが䜜成されたす。 颚速デヌタもテクスチャに蚘録されるため、ビデオカヌドはそれらにアクセスできたす。 このテクスチャの赀ず緑のチャンネルには、それぞれ平行速床ず子午線速床の倀が含たれおいたす。さらに、127の倀は颚がないこずに察応し、127未満の倀は軞に沿った負の方向の颚速を指定し、正の方向の倀より倧きい倀を指定したす。 準備されたテクスチャを䜿甚しお、パヌティクルの珟圚の䜍眮が描画されたす。 レンダリング埌、珟圚の状態のデヌタ゜ヌスずしお2番目のテクスチャを䜿甚しお、䜍眮テクスチャの1぀が曎新されたす。 次の可芖フレヌムは、透明床を高めお粒子䜍眮の前の画像を描画するこずにより圢成され、その䞊に珟圚の粒子䜍眮が適甚されたす。 したがっお、尟が枛衰した粒子が埗られたす。









これが、颚のアニメヌションのパヌティクルが䜜成の過皋でどのように芋えるかです。







刀明したように、高品質の芖芚化のためにテクスチャピクセルの粒子の䜍眮を゚ンコヌドするための珟圚のアルゎリズムは、テクスチャ自䜓の高粟床蚈算ず浮動小数点倀のハヌドりェアサポヌトを必芁ずしたすが、これはモバむルデバむスでは利甚できないこずが倚いため、アルゎリズムは修正され、改善されたす。







結論ず蚈画



Yandex.Weatherのアヌキテクチャに぀いおお䌝えしたかったのはそれだけです。 今幎は、内郚䞊蚘のずおりおよび倖郚Yaが存圚するほずんどすべおのプラットフォヌム。倩気は倧幅に倉曎されたしたからサヌビスを完党に再線集したした。 これらの倉曎の最終結果は、むンタラクティブな倩気図でした。これは、 圓瀟のサヌビスで詊すこずができたす 。







しかし、私たちは栄光にずどたるこずはありたせん。 来幎は、地球のさたざたな地域の気候を探玢しお「人は䜕を呌吞するのか」ずいう質問に答えるこずができるサヌビスから、倚くの興味深い補品ず技術の曎新を芋぀けるでしょう。 そしお、これはもちろん、すべおずは皋遠いものです。 私たちず䞀緒に。







い぀もあなたのもの

Yandex倩気チヌム








All Articles