Closed Hiroshiba closed 9 months ago
LambdaバックエンドのAPI Gateway が一般的な構成になるかと思います。
webサーバー部分をAPI Gatewayが担って、サーバーが返すresponseをLambda上で計算する形です。
AWS Lambdaページ の「カスタムバックエンドサービスの構築」の部分ですね。
全体構成は
http request ---->
API Gateway <---> VV on Lambda
http response <---
になります。
バイナリダウンロード云々は「cold start での速度バラツキ」でしょうか?
その場合はReq-Res-Req-...の形で基本的にはいいかと思います。また、たしか設定値で同時実行数制限がかけられたはずです(公式docsにそれっぽいもの(Lambda の予約済み同時実行数の管理)はありましたが、私はこの機能触った事ないです)。
(※私が現在のVoiceVox開発状況をフォローできてない & AWSをゴリゴリ使ってたのが2年ほど前なので、頓珍漢な内容でしたらすみません)
合成はGPUで行なう予定でしょうか?
Lambdaは(少なくとも数年前まで)CPU前提のシステムだったと記憶しています。
AWSの料金は転送量が意外と重いです。
音声はレスポンスサイズが結構デカくなるので、Lambdaの動作時間に基づく課金と共に、転送料金の測定をおこなうのがベターかと思います。
ありがとうございます!!
最終的にはAPI Gatewayを挟む構成にすると良さそうに思いました!! とりあえず一旦Lambdaのみにして計測するのが最短・・・?(よくわかってないです)
同時実行オプションや転送料金も勉強になります!! 場合によってはflacなどに変換したあとにレスポンス返したほうが良いかもですね。。
ご助言、助かります🙇🙇🙇
確かに、計測目的の最短ステップはLambdaオンリーですね。
いっそ、webサーバー部分もとっぱらって、例文textと実行コードを一緒にして、httpとか関係なくただLambda関数をAWSコンソールから叩くのが1番手軽かもです。
10回くらい手で叩いたら大まかな速度はわかるので、Go判断ならAPI Gateway含めたE2E測定、というイメージです。
おおなるほど!!たしかにコンソールから叩いちゃうのも手っ取り早い気がしました。 とりあえず何度か実行してみて、いろんな条件で測定したくなったら自動化・・・みたいな!
そういえば答えられていなかったのですが、CPUでの利用を想定していました。 おそらくEC2のスポットインスタンス?なりにGPUサーバー建てちゃうのが一番安そうなのですが、スケールとかロードバランス?の問題もありそうなので、手っ取り早くLambdaでできないかなーと思った次第です!
LambdaはAPI Gatewayを挟まなくても直接外に出せるようになったので、課金的にそちらのほうがいいかと。 SaaSを使うのは楽でいいのですが、課金の変動が怖いですね。
AWSはトラフィック課金もあるので、さくらのクラウドでIaaSではじめると固定費で運用できると思います。 ただし、オートスケールはしないので時間あたりくらいのアクセス制限は必要になるかと。 さくらだと、実験公開したいのだけどという相談を持ちかけると、課金免除してくれる可能性もあると思います。
API GateWayを置くかどうかは公開範囲によるとして、バックエンドに関しての話をします。 実現可能性に関しては「できそうだけど・・・」という気持ちですが、Lambdaの性質上、インスタンス内がステートレスであるほうがとても好ましいので、webサーバーを立てた状態にする、というのが非常に相性が悪いです。
私が予想するコード順序としては
という形にする必要があります。
なお、バイナリを取得してwebサーバーを起動する形にすると結構な頻度でそのサーバー起動のオーバーヘッドがランダムにLambdaのレスポンス時間に加算されますので、使う側からは速度的に非常に不安定に感じるでしょう。(Lambdaはイベント実行中に次のイベントが来た場合、順次新しいインスタンスを作成するので)
個人的なおすすめはSageMakerのサーバーレス推論機能を使用するのが良いと思います。
SageMakerサーバーレス推論公式案内ページ SageMakerサーバーレス推論公式ドキュメント英語 [SageMakerサーバーレス推論Python SDK ドキュメント英語]()
SageMakerを触る必要がありますが、ボイボエンジン側のコードの推論部分をラップする形にすれば使えるんじゃないかと思います。(私は実際にSDKを使って組んだことはないのですが・・・) ボイボエンジンの進捗も把握してないのでよくわかってませんが、ONNX化が済んでいるのであればwebサーバーを立てたりすることなく、modelからの推論を直接実行できたりするかもですね。 Amazon Elastic Inference を使用して ONNX モデルを実行する
EC2インスタンスを立てたりすることと金額的に比べてLambdaを選びたい、という場合は確かに金額的に良い結果になると思いますが、レスポンス時間まで考えると少し現実味が薄いかもしれません。 バイナリからのサーバー起動がどれくらいかかるのかがネックになるかもしれません。
横から失礼いたします。 実現可能性的にはできそうではあるが、現実的に使い物になるかは微妙な感じがします。
なお、バイナリを取得してwebサーバーを起動する形にすると結構な頻度でそのサーバー起動のオーバーヘッドがランダムにLambdaのレスポンス時間に加算されますので、使う側からは速度的に非常に不安定に感じるでしょう。(Lambdaはイベント実行中に次のイベントが来た場合、順次新しいインスタンスを作成するので)
同意です。
どうにかして全体のサイズを250MB以下に抑えられるなら、Lambda Layerであらかじめインストールしておくこともできますが、その辺実現性が分からないです。(キャラクター毎の部分であるVOICEVOX コアライブラリもサイズがかなりかさみそうに見えます)
個人的には、エンジン部分のDocker化が進んでいるので、少し修正してECSに乗せてしまうのがいいように感じました。 https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/Welcome.html
ECSはDockerコンテナをタスク的に起動することもできるし、サービスとして常駐することもできるサービスです。 今回は、ECSのサービスとしてVOICEVOXエンジンを常駐させるイメージです。 https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/ecs_services.html
ECSのサービスはある程度スケーリング・ロードバランシングもやってくれるし、EC2バックエンドにGPUインスタンスを選べばGPUも利用できる、そこまで性能が必要でない場合はFARGATEバックエンドを選んでEC2インスタンス無しの起動もできるなど、メリットがかなりあると感じました。
半面、値段的にはやさしくないのも事実です。 https://aws.amazon.com/jp/fargate/pricing/ 試しにFARGATEバックエンドを選択した場合、Linux(x86)で4vCPU/RAM8GBで1か月起動し続けたの場合のコストを概算すると、177.46 USDになりました。 ここまでくると、弱めのEC2インスタンスをバックエンドにしたほうがよさそうですね。EC2インスタンスバックエンドの場合、ECSの料金はインスタンスを借りた分だけになるので。(さらに言うと、EC2インスタンスは複数の割引プランがある)
コメントありがとうございます!!!!!!とても心強いです!!!
@kinneko さん
さくらのクラウドでIaaSではじめる
さくらさん、なるほどです!!VOICEVOXの規模感にもよりますが、もしかしたらお借りできるかもですね・・・! ただおそらくGPUマシンを借りることになりますが、VOICEVOXは処理が軽いため、GPUの性能をフルに活かすには複数のリクエストをまとめてバッチ処理(バルク処理)する必要があると思っています。 そのバルク処理用のコードを書くのがなかなか大変そうだなーーーと。。。。
@YUzushio さん
VOICEVOXエンジンの起動はだいたい5秒くらいです。
音声合成はおそらく1秒未満で完了するので、Lambdaで行く場合運が悪いと5倍ほど待たされることになりそうです。
訂正:エンジンのダウンロードもあるので、おそらく数十秒かかります。。
仮に20回音声合成するたびに1回出くわするとすると・・・すっごく微妙なところですが、我慢できなくはないけどたしかにストレスになりそうだなと思いました。
Lambdaはなるべく避けたい気がします。
SageMaker・・・・・・・・・・・・・・・・・・・・。 使いこなせると便利そうですが、ランニングコストが凄まじそうな第一印象があります・・・。 せめて妥当な価格でできうるのか最初に知りたいかもしれません・・・。
あ、↑のコメントでも書いているのですが、リクエストを束にして推論する処理(バッチ処理?)って可能だったりするかご存知でしょうか 👀 (テキスト→音声なので、入力は可変長データになります。)
@youku-s さん
確かにECSに乗っけちゃうのが良いのかなと感じました。。 GPUインスタンスだと↑のコメントにもあるようにバッチ処理しないと性能が出せなさそうなので、やるとしたらいったんCPUインスタンス・・・かなぁ・・・
FARGATEのことや、複数EC2で割引など全く知りませんでした。ありがとうございます。
皆様本当にありがとうございます。 いろいろ加味した感じ、
という気持ちになりました。 EC2+ECS、価格感的にいけそう感わかる方っていらっしゃいますか。。。
自分のPCの感じ、16vCPU(16論理プロセッサ)で、1リクエスト0.5sという感じです(本当はもう少し早そう)。 100リクエストで何円かを見積もりたい・・・・・・。
転送料金に関してのメモ。 EC2からのデータ転送の価格を見て、1音声200kBとすると、ちょっと大目に見つもって、100クエリが0.002ドル(0.2円)くらいでした。 100クエリ1円だと嬉しい状況なので、たしかにちょっと高めな印象があります。
EC2バックエンドのECSは借りているEC2インスタンスの値段しかかかりません。他サービスを利用されている場合は、それらも加算されますが、ECS単体では、そんな感じです。 以下ページのAmazon EC2 起動タイプモデルの記述をご参照ください。 https://aws.amazon.com/jp/ecs/pricing/
ちょっと外れた話になりますが、EC2の割引プランについて。 大きく分けて、リザーブドインスタンス(RI)とSavings Planがあります。 どちらもコミットメント期間(1年、3年)と支払い方法(すべて前払い、一部前払い、前払いなし)を定めてEC2インスタンスを注文すること(1台からでも可能!)で、割引を利かせるプランです。 RIの方がやや柔軟性には欠ける(途中でインスタンスタイプを変更できないなど)ものの、あまり計算がいらず、継続的な利用が見込まれる初心者にはこちらの方がおすすめです。 SPは手動で計算を行わなければならない部分がありますが、より細やかな調整が効きます。
詳細は以下記事をご覧ください。 https://dev.classmethod.jp/articles/ec2-reserved-instances-savings-plans-comparison/
あ、↑のコメントでも書いているのですが、リクエストを束にして推論する処理(バッチ処理?)って可能だったりするかご存知でしょうか 👀
バッチ処理を行うなら(リクエストを即時に返す必要がないなら)、リクエストはLambdaで受け付けて、その結果をAWS SQSなどのジョブキューにため、ECSのタスクとして消化していく非同期実行モデルが向いていると思います。(AI系の実案件でもよくつかわれるアーキテクチャです) このモデルですと、ECSの起動時間も抑えられ、非常にリーズナブルになります。FARGATE実行でもかなりお安く上がるので、EC2インスタンスを確保する必要がないかもしれません。
FARGATE実行モデルECSの料金計算機置いておきます。 https://calculator.aws/#/createCalculator/Fargate
複数タスクをバッチ処理で処理するのは、SQSからECSにつなぎこむ部分にやや工夫が必要かもしれません。 単純な仕組みの場合、問題が発生してUXが低下しやすいため、複数件溜めてのバッチ処理には非機能要件・想定ユースケースをしっかり詰める必要があると思いました。
以下記事では1つSQSにメッセージがたまった段階でApplication Auto ScalingによりECSのタスクを起動していますが、ここを任意のメッセージ数にすることも可能です。(この方法には上記の問題点があります!) https://dev.classmethod.jp/articles/sqs-to/
ありがとうございます!!EC2の割安情報助かります。
FARGATE+ECS
見積もりしてみたのですが、4vCPUで1日1個起動しっぱなしだと月144ドルという感じでした。 4vCPUがMAXなのが若干不安ですが、もし平均2台くらいでさばききれるなら割と現実的かも?と感じました!!
FARGATEってスポットインスタンス?みたいなのもあるんですね!! 更に安く済ませられそう・・・?
(2022/07/13 0:22 追記)料金計算してみた感じ、Fargateを使うとEC2の2倍くらいの価格感でした!
バッチ処理
SQSにキューイングするの、なるほどです。 さすがにユーザーが永久に待機する可能性がある設計は避けたいので、N個キューされるまで絵待機というのは難しそうに思いました! まあでも、そういうことをしないといけないんだなぁという所感になりました。 ありがとうございます!!
EC2でスピードテストしてみました!
t2.xlarge(vCPU 4)だと、1回の音声合成処理時間は平均2.708sでした。
t2.xlargeのオンデマンドは月135.49USDなので、1回辺り135.49USD / (60*60*24*30) * 2.708 = 0.00014ドル ≒ 0.019円
でした。
t2.2xlarge(vCPU 8)だと、1回の平均1.6323sでした。
t2.xlargeのオンデマンドは月270.98USDなので、1回辺り270.98USD / (60*60*24*30) * 1.6323 = 0.00017ドル ≒ 0.023円
でした。
CPU数が増えるとなぜかonnxruntimeの最高パフォーマンスが遅くなるっぽい・・・?
スポットインスタンスとか使えば価格的にはなんとかなりそうということがわかりました! ちなみにメモリ消費はdocker上で動かしても1GBとかでした。(bufferが+2GBほど)
GPUインスタンスのg4ad.xlarge(月 276.33 USD)でも速度測定したかったのですが、AWSのvCPU制限に引っかかってEC2を借りれませんでした。 スピードテスト用コードがあるので、よかったらどなたか試していただけると嬉しいです🙇 (上の方のdocker起動時にGPUなのかCPUなのかを気をつける必要があります)
↓スピードテスト用コード
自分もAWSなどで速度を試してみたいところですが、暇つぶし遊んだ結果、有名所のクラウドサービスは無料クレジット使い切ってしまっているのですよね。。。
というわけであくまで素人意見なので申し訳ございませんが、クラウドサービス化して実現したいことを何にフォーカスするかというのが費用耐効果に非常に重要になってくると思います。 クラウド維持はけして安くないので、誰に何をさせたいかが重要になってくるかと。 (例えばクラウド化でPCなどを持っていないスマホユーザやタブレットユーザなどを対象とするなど。)
そして費用対効果やレイテンシ(例えば九州地方からの通信は東日本DCのAWSに対してレイテンシが当然悪くなります)などを考えると即時応答のサービスはあまり現実的ではないのかなと思っています。
例えばスマホユーザなどが利用できるサービスを構築する場合、費用対効果だけを見ると例えばスマホアプリやWEBサイトなどで読み上げる対象と文章の登録⇨一定時間時間後に出来上がったものをダウンロードなどが現実的かなと。
また、クラウド維持費などを考えるとあまりオープンソースに対して言いたくはないのですが、課金、広告要素なども入れる必要が出てくるかと。
これはある程度までクラウド費用を抑えるためでもあります。 課金要素などがなく無制限に利用できる場合、大量に使われた結果非常に大きな費用などがかかりサービスの継続不可に繋がる可能性もあるので。(ちなみに私はプライベートクラウドを運用したときに課金要素を入れずに大失敗しました。) 1日○文字までなら無料で、それ以上は課金してねでもある程度抑えは効くかと
コメントありがとうございます!
スマホでVOICEVOX動画を作れると最高に嬉しい、という感じです。 UX的には、音声合成リクエストを投げて1秒後にレスポンスが返ってくればギリギリOKかなーと思っています。
「音声合成リクエストを投げて、1秒後にレスポンスが返ってくるシステムを、リクエスト辺り0.01円くらいで手軽に作れるか」が気になっています。 この価格にできるなら資金回収は頑張ればできそうという所感です。
で、今はサービスをどうするかというより、どう実現するか(そもそも実現するのか)困っている、という感じです!!!
連投すみません。 1秒後のレスポンスとなるとやはりネックになるのはCPU(GPU)パワーですね。 ただ当然そうなるとローコストはかなり苦しいと思っています。
あくまで案ですが、例えば思いっきりローコスト(ただしバースト時にはある程度速度が早くなるように)、に振り切るのであればこういったサイトの形式も選択肢に入るかもしれません。 (AIに文章を書かせるサイト) ai-novel.com/index.php
要はユーザが応答がなくて不快に思うのが問題の本質であって(当然レスポンスがいいにこしたことはありませんが)、ユーザには処理してますよと最低限の応答を返し、普段利用されていない(一定期間要求がない)ときはサーバを停止、利用者が多いときはサーバを常時起動、などにすれば一度否定されていますがローコストとバースト時の対応に向いているLambdaなど(もちろんAWSに限らずAzureやGCPなども比較する必要はありますが)のサーバレスも選択肢に入れれるかなと?
かなり苦しい
t2.2xlargeだと、1回辺り平均1.6323sの0.023円なので、結構惜しいラインまで来てる感覚ですね!! (目標は1sの0.01円)
かなりいい感じですね。 ちなみにちょっと暇つぶしこちらを使ってGCPのRUNで立ててみました。 (むやみにサーバレスを押しているわけではなく比較材料として) https://hub.docker.com/r/voicevox/voicevox_engine
今のところアクセスは以下のVoiceLink_VoiceVoxTestのexeから。 https://github.com/AquavitKisaragi/VoiceLink/tree/main/VoiceLink_VoiceVox 怖い人は自分でデプロイと言いたいところですが、悪用されると怖いのでアドレスを消しています。 アドレスが必要な人は私のツイッターにDM(フォローの必要はありません)ください。
※お金かかると怖いのであまりむやみに使わないでくださいm( )m
ツールはEXE の後ろにtest.json のフルパス+拡張子を消したものを引数にすれば使えます。 リクエストが有ればこちらで(いいのですかね?)
GCP Run、なるほどです。AWSにおけるFargateみたいな・・・? Fargateと同じく最大vCPUが4なんですねー
おそらくですが、python3が入っている環境で↑の「スピードテスト用コード」のbase_url
の中身を変更して実行すると、スピードテストできると思います・・・!!
せっかくなので色々試してみました。 東京リージョン(asia-northeast1) CloudRun-cpu4-mem2 CloudRun-cpu4-mem2.txt
CloudRun-cpu4-mem8 CloudRun-cpu4-mem8.txt
CloudRun-cpu8-mem8 CloudRun-cpu8-mem8.txt CPUが多いほうが当然一番早いのですがAVG:2.578025675、MIN:1.185620308、MAX:4.750459194という微妙な結果 ただ、コンピュートノード無料のものがなくなっていたため、(ケチって)仕方なく私の自宅からしたので距離の問題もあるかなと(九州島の人間なのでレイテンシはお察し・・・) ※vCPU8コアはプレビュー ただ色々とプレビュー版の機能もたくさんあるので将来に期待でしょうか?
おお!!!お試しいただきありがとうございます!!!! vCPU8があるんですね!!
結果見てみました、たしかに同じスペックっぽいAWS EC2に比べてなぜか遅めですね・・・ 2列ある結果テキストのうち、左側も通信を挟んでるのですが、そちらの遅延が大きくても0.15秒とかなので、ネット通信の遅延というより、純粋に計算に時間がかかってるっぽい印象を受けました。
もしかしたらvCPU8で起動する際に、環境変数VV_CPU_NUM_THREADS=8
を与えると速くなるかもです!!
(AWS実験した感じ、1つ減らしたVV_CPU_NUM_THREADS=7
の方がなぜか速くなったので、7の方が良いかも?)
仮にCloudRunのvCPU8で運用した時、spotインスタンスはなしで、1リクエスト1.5sかかるとすると、値段は(起動しっぱなしで)0.000216ドル
でした。EC2と一緒ぐらいだけど、spotが無い分高めになりそうな予感がしました!
環境変数+実行環境を第2世代(プレビュー)にした結果です。(通信込み)
AVG:1.476187217 MIN:0.7141757011 MAX:2.61952734 CloudRun-cpu8-mem4-pre.txt
AWSの無料枠がある人にAWSのこういったサービス試してもらいたいところですね。
おーーー!!!CloudRun、良いですね!!!!!
AWSの無料枠は弱いマシンしか借りれない印象があります・・・。 あと類似サービスはFargateやApp Runnerだと思うのですが、どっちもvCPU 4までしか選択できなそうでした・・・。
ソースコードから自前でビルドしたvoicevox_coreをLambda上で動かすことができました。 同梱されているテスト用(?)の音声モデルのみです。元々が雑音入っているため正常に動いているのかは不明です。 Lambdaのプラットフォームが初期のAmazon Linux2であるため、GLIBC2.6が必要です。GLIBC2.6環境でビルドされている製品版バージョンはありますか?
@sutekyara 良い質問だと思うのですが、issueの中身とかなり内容が異なっているので新しくissueを作成してください!
個人的にはGoogle Kubernetes Engineで動かすのがベストかと? 何故ならGKEでロードバランサーなどやりやすいと思います。 あと他のサービスですが、 GPU Sorobanなどもいいかもしれません。
GPU Sorobanに関してはGpuなので、ある程度早くなると期待が可能だと思われます。 あとはrailwayとかどうなんですかね、、、
一応日本において良さそうなホスト業者書いときます。 Akamai Connected Cloud(Linode) Vultr AWS GCP 上記四つは通信速度が速いですね。 Xserver VPS (あまり使ったことないので、わからない)
Xserver VPSは元10Gbps回線ですが各VPSの回線が100Mbpsに制限されてるのであまりよくない。 海外の大きいVPS販売者のところは大体回線が強いのでGood
通信速度って問題になりそうですか・・・? (ファイルサイズをちゃんと測定して無いのですが)100Mbpsでもかなり十分なのでは・・・?と思いました。
別に問題はないかと?
1インスタンスに複数人使用となると難しいかもしれないって思いましたけど自分の環境でも30Mbps以下だから別に大丈夫なのか
AWSのGPUインスタンスでスピードテストしました。
sudo docker run -d --gpus all --rm -p 50021:50021 voicevox/voicevox_engine:nvidia-0.12.3
NVIDIA T4 GPU を搭載した G4dn インスタンスは、機械学習の推論と小規模トレーニングのためのクラウドで最も低コストの GPU をベースとしたインスタンスです。また、高性能を提供し、CUDA、CuDNN、NVENC などの NVIDIA ライブラリを使用して NVIDIA GPU 用に最適化されたグラフィックアプリケーションに向けて提供する、費用対効果の高いソリューションです。最大 8 つの NVIDIA T4 GPU、96 の vCPU、100 Gbps ネットワーキング、および 1.8 TB のローカル NVMe ベースの SSD ストレージを提供し、ベアメタルインスタンスとしても利用できます AWS公式の説明より
1回の音声合成処理時間は平均0.884sでした。
g4dn.xlargeの東京リージョンのオンデマンド料金は1時間0.71USDなので、1回辺り0.71USD / 60 / 60 * 0.884 = 0.0001743444ドル ≒ 0.024円でした。(USDJPYレート=135.74の場合) なお、同インスタンスに東京リージョンでリザーブドインスタンスの最も安価になるオプションを適用した場合、1年コミットで1時間0.452USD, 3年コミットで1時間0.314USDになります。SPOTインスタンスの場合は20230514現在1時間0.213USDです。(SPOTインスタンスの価格は需給により変動します)
g4シリーズ価格表(当該ページの記載はバージニアリージョンに準拠) リージョン別の価格はこちらで検索してください
コンテナ起動後に、同一テキストを2回以上投入したところ、キャッシュにより劇的に高速になりました。 VOICEVOXのキャッシュ機構を理解できていませんが、もしよく使われるフレーズなどを効率的にキャッシュしておけるなら、実際のスピード/1クエリあたりの実行コストはもっと良くなりそうです。
2回目以降の音声合成処理時間は平均0.253sでした。
g4dn.xlarge(GPU メモリ:16GiB)との比較のため、g5.xlarge(GPU メモリ:24GiB)でも試してみました。 インスタンスタイプ別のGPUメモリ搭載量はこちらを参照
1回の音声合成処理時間は平均0.451sでした。
g5.xlargeの東京リージョンのオンデマンド料金は1時間1.459USDなので、1回辺り1.459USD / 60 / 60* 0.451 = 0.0001827802ドル ≒ 0.025円でした。(USDJPYレート=135.74の場合) なお、同インスタンスに東京リージョンでリザーブドインスタンスの最も安価になるオプションを適用した場合、1年コミットで1時間0.592USD, 3年コミットで1時間0.378USDになります。SPOTインスタンスの場合は20230514現在1時間0.4473USDです。(SPOTインスタンスの価格は需給により変動します)
インスタンス1つの時間あたりの利用料金はg4dn.xlargeの方がg5.xlargeよりも安い一方で、性能を勘案すると1クエリ辺りの料金は実はそれ程変わらないことがわかります。
g5シリーズ価格表(当該ページの記載はバージニアリージョンに準拠) リージョン別の価格はこちらで検索してください
2回目以降の音声合成処理時間は平均0.116sでした。 キャッシュ有効時の処理速度はg4dn.xlargeの約半分になりました。
その他の有力そうなAWSのGPUインスタンスとして以下が挙げられますが、VOICEVOXが動くかどうか(どうすれば動かせるか)が不明であったため検証できていません。もしこの辺りが使えるなら、より安く&速くなる可能性があります。 GPUインスタンスの一覧はこちらを参照ください
AMD製GPU搭載インスタンスです。東京リージョンの1時間辺りの料金は0.51082USDなので、g4dn.xlargeに比べて安価です。 AMD製GPU * linuxの組合せでVOICEVOXが動くのかが不明であったため検証できていません。 g4シリーズ価格表(当該ページの記載はバージニアリージョンに準拠)
AWS社の独自機械学習推論用プロセッサのInferentiaを積んだ、推論に特化したインスタンスです。AWSの発表によれば、推論系の処理に関して全てのインスタンスで最もコスパが良い(速くて安い)とのことなので、有望かもしれません。 参考:Inf2公式ページ 参考:AWSの推論用インスタンスInf1について 参考:AWS Inf1上でBERTモデルの推論を走らせる―モデルコンパイルから速度比較まで InferentiaでVOICEVOXが動くのかが不明であったため検証できていません。 なお、今年初頭リリースした最新式のInf2インスタンスは現状バージニアリージョンとオハイオリージョンのみで提供されています。Inf1インスタンスであれば東京リージョンでも提供されています。
上記の価格は東京リージョンの価格をベースに計算していますが、インスタンス辺りの利用料金は北米のリージョン、特にバージニアリージョンの方がずっと安いです。 例えば、東京リージョンで1時間0.71USDのg4dn.xlargeは、バージニアリージョンでは0.526USDです。東京リージョンで1時間1.459USDのg5.xlargeは、バージニアリージョンでは1.006USDです。この傾向はリザーブドインスタンス、Savings Plan、SPOTインスタンスの場合でも同様です。 料金の差について公式な理由は説明されていませんが、一般論としては北米のリージョンの方が利用ボリュームが大きいため、規模の経済により安価で提供できるためと言われています。 また、SPOTインスタンスの在庫量についても、一般に東京よりも北米のリージョンの方が潤沢な傾向にあると言われています。(=安価になりやすい&中断されづらい) 加えて、最新機能やハードウェアが他リージョンに比べて比較的速くリリースされます。(バージニアリージョンでリリースされて数週間~数年経ってから東京リージョンでもリリースされる、といったことが起きます) 従って、地理的な距離によるNWレイテンシとのトレードオフは発生するものの、東京以外のリージョンを利用する選択肢も検討する余地があると考えます。 リージョンとデータサイズごとのNWレイテンシの計測にはAWS公式のツールが利用できます。 https://speedtest.globalaccelerator.aws/#/ また、AWSのバックボーンの通信経路を間借りすることで、地理的な距離を跨いだ通信のユーザ向けのNWレイテンシを改善するGlobal Acceleratorという仕組みもあります。 https://aws.amazon.com/jp/global-accelerator/#:~:text=AWS%20Global%20Accelerator
ご存知かと思いますが、SPOTインスタンスは利用中にAWS側の都合で中断される(2分の猶予期間を経てシャットダウンされる)仕様があります。これはSPOTインスタンスが本質的にAWSインフラの余剰リソースを一時的に安価で貸出すサービスであるためです。 従って、SPOTを使ってサービスをデザインする場合は、複数のSPOTインスタンスのクラスターを組んで一部がダウンしてもサービスが継続できるようにするなどの独自の設計が必要になります。(きちんと認識した上で設計すれば普通に使えると思います!) スポットインスタンスの中断 EC2スポットインスタンスのすべて
@lawofcycles 詳細ありがとうございます、とても参考になります!!
キャッシュが効いた状態
VOICEVOXエンジンは特にキャッシュ機構を意図して用意してなかったりします。 FastAPIサーバーが気を利かせてキャッシュしているとか・・・・・・? あるいは内部で使っているonnxruntimeに実はキャッシュ機構があるとか・・・。 ちょっと全くわからないですが、知らないテキストが来る方が圧倒的に多いはずなので、遅い方を検証するのが目的にかなっていそうだなと思いました!(何かよくわからないけど避ける)
SPOTインスタンス
あ、そんなに価格変わるんですね!!
g4dn.xlargeだと1リクエスト0.0071
円、g5.xlargeだと0.0076
円。更にリージョンを変えるともしかしたら更に3/4倍くらいの価格感なんですね!
最初のなんとなく考えたのが1リクエスト0.01円ならという感じなので、その値を下回れそうというのがとてもよくわかりました、ありがとうございます!!
ここまで来るとaws cdk使って使いやすいクラウドVOICEVOX APIを作るコードをOSSで作るとかも面白そうに思いました!!(いわゆるIaC)
ちなみにVOICEVOX APIの見えてる需要はこんな感じです。
このあたりに役立つような最大公約数的な機能があると良さそうかも。 とりあえず動けばいい感じだと、スポットインスタンスを使うとか、ユーザーごとの実行頻度スロットリング機能(認証?IPアドレス?)とか。 より進んだ機能だと、オートスケールとか、混み具合返すとか・・・! そしてそれらが動くためのインフラ一式があるとすごく楽しいかもとか思いました!
Spotは確かに安いのですが、ホストサーバーのリソースがフルに近づくと、勝手に止められる恐れが。。。
AWSだしさすがにないのでは? (Spotに関しては触ったことないので分かりませんが...)
いや、spotって確かホストで余ったリソースがある限り運用できるサービス 逆に余らなくなると、vm消す必要が出てくる
CPU100%になったら別料金じゃないっけ 自分の記憶違いかな
いや、停止だったはず
mjk
多くの方々の貢献により、クラウドでの費用感が明確化できたと考えています。
また、示された発展の方向性も #682 で個別 issue 化されています。
@Hiroshiba
本 issue は役割を果たしたと考えます、更なる論点がありそうでしょうか?(close可能?)
そうですね、計測して温度感が掴めたので完了だと思います! 皆様ありがとうございました!!!
内容
VOICEVOXのクラウド版が実現が可能かを調べたいです。 いったんAWS Lambdaを検討中なのでですが、どれくらい速度が出るのかを測定するIsuseです。
テキストを投げて、音声合成結果を返すのを1処理とし、金額あたりの処理数を知りたいです。
クラウドは全然詳しくないので僕だと非力です、もし詳しい方がいらっしゃったらお力をお借りしたいです。
Pros 良くなる点
クラウド版ができるかもしれない
Cons 悪くなる点
測定方法がわからない
実現方法
AWS Lamdaにlinux版VOICEVOX ENGINEバイナリをダウンロードして、lambda内でwebサーバーを起動し、lambdaでリクエストを受け取ってwebサーバーにリクエストする・・・とか? 音声合成は簡単で、こんな感じでリクエストすれば結果が帰ってきます。
おそらくlambdaは起動数などがスケールして、そのたびにバイナリダウンロードするため速度測定に影響がありそうな気がしています。 なので測定時は、lambdaにテキストを投げた後、レスポンスが返ってきてからまたリクエストを投げる、というのが良いのかなと思ってます。 (これでも勝手にスケールしますかね。。)
文章は
Lorem JPsum 自然な日本語ダミーテキスト
などで作成するのを考えてます。 とりあえずこんな感じでどうでしょう(200文)その他
なんとなくの概算ですが・・・ 仮に100リクエスト1円とかであれば、広告を1回見るだけで5分ほどは作業できそうなので成り立ちそうな気がします。 仮に1リクエスト1円とかであれば、調整するたびに広告がリロードされる最高のアプリが出来上がる気がします。