※この投稿は米国時間 2019 年 3 月 7 日に Google Cloud blog に投稿されたものの抄訳です。
今日、多くの企業が複雑な脅威環境に直面しています。ユーザー、ネットワーク、機密情報、コミュニケーションを標的とした攻撃の巧妙化や大規模化が進み、あらゆる規模の組織がこうした脅威を防ぐために、簡単にデプロイして管理できる高度なセキュリティ機能を必要としています。私たち Google Cloud は革新的なセキュリティ機能をお客様に提供することを常に目指していますが、それは私たちのプラットフォームでワークロードを実行していない組織に対しても同様です。
Web Risk API とは
私たちはこのたび、Web Risk API のベータ提供を開始しました。Web Risk API は、ウェブ上でお客様のユーザーを保護するように設計された新しい Google Cloud サービスです。このシンプルな API を呼び出せば、安全ではないウェブ リソース リストを基に、クライアント アプリケーションにおいて URL をチェックできます。
Google が作成したこのリストには、フィッシング サイトや偽サイトのようなソーシャル エンジニアリング サイトや、マルウェアや迷惑ソフトウェアをホストするサイトなどが含まれます。Web Risk API によって既知の不正サイトを迅速に特定すれば、マルウェア感染ページに誘導する可能性があるリンクをユーザーに警告したり、悪意あるページへのリンクをユーザーが利用すること(たとえば、悪意ある URL をコメントに含める)を防いだりできます。
Web Risk API には 100 万以上の安全ではない URL のデータが含まれており、私たちは毎日数十億の URL を調査することでリストを最新の状態に保っています。こうした Web Risk API は、Google Safe Browsing の土台となっている技術と同じものに支えられています。Safe Browsing による保護はすべての Google プロダクトで機能し、日々インターネットで 30 億台以上のデバイスを保護することに役立ってきました。Safe Browsing に携わるエンジニアリング、プロダクト、オペレーションの各チームは、セキュリティの研究および技術の最前線で、人々を害悪から守るシステムの構築に取り組んでいます。そして現在では、Safe Browsing と技術を同じにする Web Risk API を通じて、企業がユーザーを保護できるようになりました。
モバイルゲームは現在も日々進化し、ゲーム業界を革新し続けています。しかし、ゲーム表現がより高度になっている一方で、複雑なゲーム内容が初心者の参加を妨げてしまうという課題は残り続けています。今回紹介する、株式会社ディー・エヌ・エー(以下、DeNA)の大ヒットゲーム『逆転オセロニア』※では、その問題を Google Cloud Platform(GCP)上に構築した AI 基盤を活用することで見事に解決。ここでは、その取り組みについて聞いてきました。
2019 年 2 月に 3 周年を迎えた『逆転オセロニア』は、今後も AI を活用したプレイヤー体験向上を追求。将棋の感想戦的な指導機能や、まったく新しいゲーム体験につながる機能も検討されているようです。
「可能性だけでいえば AI の使い道はまだたくさんあります。ただ、私達の目的はあくまでもゲームの体験を良くすること。AI のための AI 開発にはせず、プレイヤー視点で実用化を検証していきたいと思っています。並行して進めている事例になりますが、人力でおこなうには負荷が大きいゲームバランスの調整を AI が一部サポートする取り組みも、試験的に検証しています。」(奥村さん)
ML Engine などの AI プロダクトを駆使してゲーム作りを変えていく
AI 技術を効果的に駆使することで、プレイヤー体験の向上に成功している『逆転オセロニア』ですが、その基盤に GCP を採用したのはなぜでしょうか?奥村さんは次のように語ります。
「『逆転オセロニア』の AI 基盤を構築するに際し、もちろん GCP 以外の選択肢も検討しました。その際、決め手となったのは GCP がフルマネージドなサービスであったこと。我々は AI の専門家なので、AI の開発や精度向上こそ注力すべきであり、AI の運用コストはできるだけ抑えたいと考えています。しかし、特にゲームサービスではイベントオープン時にリクエスト数が一気に 10 倍になったりするなど、非常に難しい分野。そうしたスケーラビリティも含めすべてお任せしたいと思い、GCP を選びました。」(奥村さん)
現在、『逆転オセロニア』の AI 基盤には、GCP プロダクトをオールスター活用。データの収集・蓄積には BigQuery を、データの加工、モデリングには Google Compute Engine を、モデルのデプロイには、ML Engine を活用。他、モデルに基づき最適なデッキ編成をおこなうサーバーには Google App Engine(GAE)を、モニタリングには Stackdriver を採用しており、細かいところではデータ管理周りは Cloud Pub/Sub や Google Cloud Functions、Cloud Datastore なども駆使しているとのことです。
ゲーム攻略を中核に、メディアという領域を超えて、コミュニティや e スポーツなどに事業を発展させている株式会社GameWith(以下、GameWith)。取り組みの一環として、スマートフォン向けの WEB マンガサービス「MangaWith(マンガウィズ)」をリリースしました。「MangaWith」の開発責任者、およびエンジニア 2 名と、開発をサポートしたクラウドエースの担当者 2 名に、「MangaWith」の開発について伺いました。
開発では、固定 IP が必要な部分、必要でない部分に分ける工夫をしています。固定 IP が必要な部分は、スケールの範囲がある程度決まっているので、1 つのサービスが止まっても、サービス全体が止まらない仕組みにしてあります。田口さんは、「Kubernetes を使うことで、CPU の負荷が高くなったらコンテナを自動的に増やすことも簡単にできます。ロジックを書くことなく、Kubernetes が自動で処理してくれるので助かります」と話します。
Ubisoft 傘下の Massive Entertainment が最近リリースした待望久しい『Tom Clancy's The Division 2』では、世界中でゲーム サーバーをホスティングするパブリック クラウド プロバイダーとして Google Cloud が選ばれました。Massive Entertainment と Google Cloud は、ローンチ時にすべてのプレーヤーにスムーズなオンライン エクスペリエンスとサービスを提供するべく緊密に協力してきました。
Massive Entertainment のオンラインおよびライブ オペレーション責任者、Fredrik Brönjemark 氏は次のように述べています。
「初期テストとプライベート ベータにおける Google Cloud の仕事ぶりは目を見張るもので、ローンチ初期段階でのスケーリング能力には感動しました。しかし私たちにとってより重要なことは、信頼できるパートナーを見つけることでした。Google Cloud のエンジニアやゲーム エキスパートのチームは、まさにその条件にぴったりで、私たちが最初にゲーム インフラストラクチャを設計したときから、プライベート ベータ、ローンチに至るまで、常に技術的な支援を提供してくれました。」
Massive Entertainment は、世界中のプレーヤーの需要に対応できる、スケーラブルで信頼性の高いクラウド サービスを探していました。Google Cloud は、Massive Entertainment が常に高いゲーム パフォーマンスを確保できるよう、使いやすさ、柔軟性、スケーラビリティを提供しています。
Google Cloud のセキュアでグローバルな高速ファイバー ネットワークは、世界中のプレーヤーにハイパフォーマンスなゲーム体験を一貫して提供し続けることが可能です。このスケーラブルなインフラストラクチャは、マッチメイキング、ハイスコア、統計データ、アイテム管理など、ゲームで必要とされるデータとコア サービスもサポートしています。
ゲーム開発企業が、ゲーム サーバーのホスティング、プラットフォーム サービス、機械学習、アナリティクスのために Google Cloud をどのように活用しているかについては、こちらをご覧ください。また、Google Cloud 上でのゲーム開発の詳細はこちらのウェブサイトをご覧ください。
- By Sunil Rayan, Google Cloud for Games Managing Director
def publish(self):
# Finish if inactive
if not self._active:
return
# Process network events.
self.client.loop()
# Wait if backoff is required.
if Publisher.should_backoff:
# If backoff time is too large, give up.
if Publisher.minimum_backoff_time > MAXIMUM_BACKOFF_TIME:
print('Exceeded maximum backoff time. Giving up.')
return
# Otherwise, wait and connect again.
delay = (Publisher.minimum_backoff_time +
random.randint(0, 1000) / 1000.0)
print('Waiting for {} before reconnecting.'.format(delay))
time.sleep(delay)
Publisher.minimum_backoff_time *= 2
self.client.connect(self.mqtt_bridge_hostname, self.mqtt_bridge_port)
# Refresh token if JWT IAT has expired.
seconds_since_issue = (datetime.datetime.utcnow() - self._jwt_iat).seconds
if seconds_since_issue > 60 * self.jwt_exp_mins:
print('Refreshing token after {}s').format(seconds_since_issue)
self._jwt_iat = datetime.datetime.utcnow()
self.client = self.get_client()
# Generate payload
d, t = self._data[self._count]
Publisher.rotate_message(self._msg, d, t)
payload = json.dumps(self._msg).encode('utf-8')
# Publish "payload" to the MQTT topic. qos=1 means at least once
# delivery. Cloud IoT Core also supports qos=0 for at most once
# delivery.
self.client.publish(self._mqtt_topic, payload, qos=1)
self._count += 1
上記アーキテクチャの実装方法としては、TensorFlow ネイティブ API(tf.layers と tf.nn)と Keras API(tf.keras)の 2 つがあります。
Keras は、TensorFlow のネイティブ API と比べて高レベルの API であり、使いやすさ、モジュール性、拡張性の 3 つの長所を兼ね備えたディープ ラーニング モデルのトレーニングと提供を可能にします。一方、tf.keras は TensorFlow による Keras API 仕様の実装です。次のコード例では、LSTM ベースの分類モデルを両方の方法で実装しています。比較してみてください。
TensorFlow のネイティブ API を使用したモデルの実装 :
# RNN network using multilayer LSTM
cells = [tf.nn.rnn_cell.DropoutWrapper(
tf.nn.rnn_cell.LSTMCell(params['lstm_size']), input_keep_prob=1 - params['dropout_rate'])
for _ in range(params['num_layers'])]
lstm = tf.nn.rnn_cell.MultiRNNCell(cells)
# Initialize the state of each LSTM cell to zero
state = lstm.zero_state(batch_size, dtype=tf.float32)
outputs, states = tf.nn.dynamic_rnn(cell=lstm,
inputs=tf.expand_dims(seq_data, -1),
initial_state=state,
dtype=tf.float32)
# Flatten the 3D output to 2D
flatten_outputs = tf.layers.Flatten()(outputs)
logits = tf.layers.Dense(params['num_appliances'])(flatten_outputs)
Keras API を使用したモデルの実装 :
# RNN network using multilayer LSTM with the help of Keras
model = keras.Sequential()
for _ in range(params['num_layers']):
model.add(
keras.layers.LSTM(params['lstm_size'],
dropout=params['dropout_rate'],
return_sequences=True)
)
# Flatten the 3D output to 2D
model.add(keras.layers.Flatten())
model.add(keras.layers.Dense(params['num_appliances']))
logits = model(tf.expand_dims(seq_data, -1))
トレーニングとハイパーパラメータ調整 Cloud ML Engine は、トレーニングとハイパーパラメータ調整の両方をサポートしています。図 6 は、さまざまな組み合わせのハイパーパラメータを使って複数回試行したときの、電化製品全体の平均精度、再現率、F 値を示しています。ハイパーパラメータの調整により、モデルのパフォーマンスが大幅に向上しています。
* 1. Jack Kelly and William Knottenbelt. The UK-DALE dataset, domestic appliance-level electricity demand and whole-house demand from five UK homes. Scientific Data 2, Article number:150007, 2015, DOI:10.1038/sdata.2015.7. - By Yujin Tang, ML Strategic Cloud Engineer, Kunpei Sakai, Cloud DevOps and Infrastructure Engineer, Shixin Luo, Machine Learning Engineer and Yiliang Zhao, Machine Learning Engineer