Google I/O 2019
参加報告
SRA 産業第1事業部 鈴木真吾
Agenda
-
Google I/O 2019 について
-
Android関連のトピック
-
機械学習関連のトピック
-
その他
Google I/O 2019
Google I/O
-
発表者について
-
Google I/O とは
-
Google I/O の内容
-
Google I/O に参加しよう
発表者について
鈴木真吾(@giantneco)
所属: 産業第1事業部
言語: Go, C, Scala, etc
-
Google I/O
Google I/O 2016 に続いて 2 回目の参加
Google I/O とは
Google 開催の年次開発者向けイベント
-
毎年 5 月頃に開催
-
マウンテンビューの Google 本社近くで開催
-
メインは Android, Web など
-
アプリ開発者向け
-
Google I/O の内容
- キーノート
- セッション
- SandBox
- Codelabs
- Office Hour
- After Party
- Workshop (new!)
Google I/O 2019
- 参加者
- 7000+
- セッション
- 約180
- 大体の内訳
- Android 関連 60
- Web 関連 40
- 機械学習関連 30
- クラウド関連 15
- AR 7
- VR 0
キーノート
新製品
-
Pixel 3a
-
Google Nest Hub
Sandbox
- 製品・アプリの展示
- 開発者に説明をして貰うことができる
Codelabs
- Google が公開している学習コンテンツ
- Google I/O 現地で、発表された技術をすぐに試せる
After Party
参加まで
- チケットは 2 月末ごろに抽選
- キャンセル分繰り上げ・invitation code 配布は 4 月末
- 大体の予算
- チケット代 130,000
- 飛行機代 100,000
- 宿泊費 70,000
- サンタクララあたりに宿泊
- 空港
- サンフランシスコ空港
- サンノゼ空港 <- 今回はこちら
- 最短だと 1 日目朝到着、3 日目夕方帰る
前後でもいろいろイベントがある
参加する場合は前後も余裕を持っていくのがオススメ
- Google 見学
- Intel Day 0 Party
- Netflix Day 0 Party
- 日本人エンジニアのミートアップ
Android
Android の主な発表
- Android Q
- Jetpack の変更
- Android Studio 3.5
Android 動向
-
Android Q
-
名前の決定はまだ先
-
-
Kotlin ファースト
-
Jetpack など Kotlin 優先的に対応される
-
Jetpack Compose などは Kotlin 専用
-
Kotlin Everywhere の開催
-
Android Q
Android Q System UI に関する変更
- Bubbles
- Dark Theme
- Share Sheet
- Notification Priority
- Gesture Navigation
- Desktop mode
- Foldable 対応
Bubbles
新しい通知機能
- システムアラートメッセージの置き換え
-
- パフォーマンス etc で問題点があった
Bubbles
notif.setBubbleMetaData(
new Notification.BubbleMetadata.Builder()
.setIcon(Icond.createWithAdaptiveBitmpa(bitmap))
.setDeiredHeight(600)
.setIntent(bubbleActivityIntent)
.build());
Dark Theme
対応方法は 3 つ
- ダークテーマを使用 (もっとも楽)
- ダークテーマ用のリソースを用意する
- ダークテーマの強制適用
- ダークテーマを無視
Dark Theme
- Q から Android でもダークテーマが利用可能に
- 目に優しい
- バッテリーに優しい
- etc
ShareSheet
- シェアシートのデザイン・ API が変更
- クリップボードは上に
- コンテントプレビュー
- API の変更
Notification Priority の追加
- Priority と Gentle
Gensture Navigation
- ジェスチャーナビゲーション
- バックボタンの将来的な廃止
- デザインガイダンスの変更
プラットフォーム的な変更
-
WebView
-
テキスト
-
拡大鏡
-
非 SDK インターフェースの制限が更新
非 SDK インターフェースの制限
-
SDK で提供されていない API 呼び出しの制限
-
Pie から制限が開始
-
Q で制限のリストが更新
-
Android Q セキュリティ・プライバシ
- 位置情報のパーミッション変更
- Shared Storage の変更
- 端末固有番号
- バックグラウンドからのアクティビティ起動
- アプリからの Wifi on/off が無効化
- 設定パネルがアプリ内から呼び出し可能に
位置情報のパーミッション変更
- P 以前
- 位置情報をアプリに常に開示するかどうかの 2 択
- Q
- バックグランド動作時にも許すかどうかが追加
端末固有番号の扱い
- リセットできない端末固有番号の取得に制限
- READ_PRIVILEGED_PHONE_STATE
- MAC アドレスのランダマイズ
バックグラウンドからのアクティビティ起動
アクティビティの起動に制限
基本的にバックグラウンドからの起動は不可に
アクティビティは:
- フォアグラウンドで起動
- フォアグラウンドからのインテントで起動
- システムからのインテントで起動
- システムからのブロードキャストで起動
ART の変更
-
プロファイルがクラウドに
-
Generational Concurrent Copy GC
-
起動プロセスの変更
Kotlin
-
Q の Kotlin API では Nullable アノテーションがつけられる
-
kapt 1.3.30 からインクリメンタルなアノテーションプロセッシング
-
Jetpack のライブラリでコルーチンが使用可能になった
Jetpack
Jetpack
-
androidx.preference
-
CameraX
-
Architecture Components
-
Jetpack Compose
-
Jetpack Benchmark
androidx.preference
-
android.preference -
androidx.preference
CameraX
カメラを簡単に扱えるようにするライブラリ
-
camera2API のラッパー
-
Google によりテストがされている
-
backward compatible
-
L+ に対応
-
Architecture Components
-
workmanager 1.0.1 and 2.0.1
-
navigation 1.0 and 2.0
-
SaveState for ViewModel 1.0 alpha
-
benchmarking 1.0 alpha
-
Lifecycyels, LiveData, Room: コルーチン対応
-
ViewPager
-
ViewBindings + SavedState
Jetpack Compose
-
Declarative UI
-
現在まだ α 前
-
リストが書ける程度
-
import androidx.compose.*
import androidx.ui.core.*
@Composable
fun Greeting(name: String) {
Text ("Hello $name!")
}
比較
struct Content : View {
var body: some View {
VStack {
Text("Hello World")
}
}
}
Swift UI
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
home: new Scaffold(
body: new Center(
child: new Text('Hello World'),
),
),
);
}
}
Flutter
機械学習
機械学習
- TensorFlow
- TensorFlow 2.0
- TensorFlow の新しいライブラリ
- Cloud TPU Pods
-
ML Kit
- AutoML
- ML fairness
- Federated Learning
- TensorFlowX (TFX)
TensorFlow の新しいライブラリ
- Keras Tuner
- TensorFlow Probability
- TF-Ranking
- TensorFlow graphics
- TF Agent
etc...
Keras Tuner
- ハイパーパラメータチューニングのライブラリ
- 現在 pre-alpha
- TensorFlow 2.0, Python3.6
- https://gist.github.com/giantneco/e12fdba557de538598e704bcf23dae46
TF-Agents
強化学習用の TensorFlow ライブラリ
- TensorFlow 2.0 向け
- 一応 TensorFlow 1.3 でも動く?
- ポリシーベースの強化学習
- 主流な強化学習に対応
- DQN, DDQN, etc
Cloud TPU Pods
TPU で作ったスパコン
- パブリックベータ
- クラウド
Coral
- IoT 上の AI を開発するためのフレームワーク
- ソフト、ハードどちらも
- TensorFlow Light をサポート
MLKit
-
AutoML Vision Edge
-
Firebase 上で画像認識のモデル作成
-
ML Kit で利用可能に
-
- 新機能
- オンデバイス翻訳
TensorFlow 2.0
TensorFlow 2.0
ベータ1 が 2019/06 にリリース
- より python らしい書き方ができる
- 大域変数の排除、オブジェクト指向らしい書き方
- デフォルトで eager mode
-
tf.keras as the recommended high-level api
- API が整理された
- tf.contrib は deprecated
- 重複の削除
Eager mode
= Define by Run
- Chainer、PyTorch などはもともとこの方針
-
強化学習、RNN、自然言語処理などに有利
-
従来の Defined and Run (graph mode) も併用可能
graph mode vs eager mode
import tensorflow as tf
a = tf.Variable(0, name='counter')
with tf.control_dependencies([tf.assign_add(a, 1)]):
b = tf.case({
tf.equal(tf.mod(a, 15), 0): lambda: tf.constant("FizzBuzz"),
tf.equal(tf.mod(a, 3), 0): lambda: tf.constant("Fizz"),
tf.equal(tf.mod(a, 5), 0): lambda: tf.constant("Buzz"),
}, default=lambda: tf.as_string(a))
sess = tf.Session()
sess.run(tf.global_variables_initializer())
for i in range(100):
print(sess.run(b).decode())
import tensorflow as tf
def fizzbuzz(max_num):
counter = tf.constant(0)
max_num = tf.convert_to_tensor(max_num)
for num in range(1, max_num.numpy()+1):
num = tf.constant(num)
if int(num % 3) == 0 and int(num % 5) == 0:
print('FizzBuzz')
elif int(num % 3) == 0:
print('Fizz')
elif int(num % 5) == 0:
print('Buzz')
else:
print(num.numpy())
counter += 1
model subtyping
これまでの書き方
model = tf.keras.models.Sqeuential([
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(512, activation='relu'),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Dense(10, activation='softmax')
])
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics['accuracy'])
model.fit(x_train, y_train, epochs=5)
model.evaluate(x_test, y_test)
class MyModel(tf.keras.Modle):
def __init__(self, num_classes=10):
super(MyModel, self).__init__(name='my_model')
self.dense_1 = layers.Dense(32, activation='relu')
self.dense_2 = laysers.Dense(num_classes, activation='sigmoid')
def call(self, inputs):
# Define your faorward pass here
x = self.dense_1(inputs)
return self.dense_2(x)
New
TensorFlow Federated Learning
Federated Computation
非中央集権型データを扱う Map Reduce
- ノードはランダムに抽出
- "Secure Aggregation"によりノードのプライバシを保つ
データセンター内の Map Reduce に比べて:
- より大規模なノードを対象に可能
- 全数検査ではないので‥
- 通信切断などエッジデバイスが一時利用不可になった場合でも使える
Federated Computation
?℃
31℃
28℃
26℃
34℃
Federated Computation
?℃
31℃
28℃
26℃
34℃
> 30℃?
Federated Computation
?℃
31℃
28℃
26℃
34℃
> 30℃?
1
0
1
31℃
Federated Learning
- Federated Computing を機械学習に使用
- 分散先=エッジデバイスでは
- サーバ提供の親モデルから転移学習
- 学習結果は Secure Aggregation でサーバ側に反映
- プライベートな情報は渡さない
利点:
- 各エッジデバイスではパーソナライズされた学習データを利用できる
- Gboard での絵文字サジェスチョンなど
- プライバシなどで問題のあるデータはやりとりしない
TensorFlow Federated Learning
TensorFlow Federated API:
- Federated Learning 用の高レベルAPI
- 既存の TensorFLow モデルを利用可能
TensorFlow Federated Core:
- Federatedアルゴリズムを作成するための低レベルAPI
+シミュレーション用の API
Machine Learning Fairness
Machine Learning fairness
ここでの「fairness」はジェンダー、アイデンティティetc
- Fairness by Data
- Fairness by Measurement and Modeling
- Fairness by Design
Fairness by Data
Fairness by Data
Fairness by Data
データ自体が偏りを持つ恐れがある
教訓:
- 母集団の多様性を反映する訓練・評価データを作成する
- ターゲットとするユーザが除外するかもしれないものを考慮する
- データが将来違った意味を持ちうる事を意識する
Fairness by Measurement and Modeling
Fairness by Measurement and Modeling
観測したデータは、違う文脈では意図していない意味を持っているかもしれない
教訓:
-
早めにテスト・頻繁にテストする
-
複数のメトリクスを用意
-
プロダクトが持つべき制約を意識してモデリングする
Fairness by Design
Fairness by Design
プロダクトのデザインによって公平性を損ねる場合がある
対策:
-
文脈次第で意味が変わる場合がある
-
多様な背景を持ったユーザからフィードバックを受ける
-
多様なユーザに合わせた体験を提供する
TensorFlow Extended
TensorFlow Extended (TFX)
TensorFlow-base の汎用かつスケーラブルな
機械学習プラットフォーム
引用:TFX: A TensorFlow-Based Production-Scale Machine Learning Platform
TensorFlow Extended (TFX)
TensorFlow Extended (TFX)
TensorFlow Extended (TFX)
TensorFlow Extended (TFX)
TensorFlow Extended (TFX)
def _create_pipeline():
examples = csv_input(...)
example_gen = CsvExampleGen(input_base=examples)
statistics_gen = StatisticsGen(...)
infer_schema = SchemaGen(...)
validate_stats = ExampleValidator(...)
transform = Transform(...)
trainer = Trainer(...)
model_analyzer = Evaluator(..)
model_validator = ModelValidator(...)
pusher = Pusher(...)
return pipeline.Pipeline(
pipeline_name='simple',
components=[
example_gen, statistics_gen, infer_schema, validate_stats, transform,
trainer, model_analyzer, model_validator, pusher
], ...
)
airflow_pipeline = AirflowDAGRunner(_airflow_config).run(_create_pipeline())
その他
Flutter
- Flutter 1.5.4
- Flutter Web
- Dart
Flutter Web
- ベータ、すでに利用可能
$ flutter pub global activate webdev # install webdev
$ flutter pub upgrade # upgrade packages
:
$ flutter packages pub global run webdev serve
import 'package:flutter_web/material.dart';
void main() {
runApp(new Text('Hello World', textDirection: TextDirection.ltr));
}
プラグインの追加と実行
Hello World
Dart
- NULL(非)許容型 (being implemented)
int? number = int.tryParse('not int');
print(number.isEven);
Dart 言語仕様は github で管理される
- 拡張メソッド (being implemeted)
String String.double() => this + this;
Kotlin かな?
Chromebook
Linux on Chromebook
Linux on Chromebook
-
2019/05 以降発売の全ての Chromebook で Linux 対応
-
Pixel などでは既にできていた
-
-
2クリックでセットアップ
-
apt-get が使用可能
- Chromebook 内部は lxc
- もともとコンテナでセキュリティ確保していた
- (余談) Intel の Dev Day 0 でもけっこう push されてた
ご清聴ありがとうございました
Google I/O 019 参加報告
By Shingo Suzuki
Google I/O 019 参加報告
社内向け Google I/O 2019 参加報告資料
- 1,217