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

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 つ

  1.  ダークテーマを使用 (もっとも楽)
  2.  ダークテーマ用のリソースを用意する
  3.  ダークテーマの強制適用
  4.  ダークテーマを無視

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

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

 

  1. Fairness by Data
  2. Fairness by Measurement and Modeling
  3. Fairness by Design

 

Fairness by Data

Fairness by Data

Fairness by Data

データ自体が偏りを持つ恐れがある

 

教訓:

  1. 母集団の多様性を反映する訓練・評価データを作成する
  2. ターゲットとするユーザが除外するかもしれないものを考慮する
  3. データが将来違った意味を持ちうる事を意識する

 

 

Fairness by Measurement and Modeling

Fairness by Measurement and Modeling

観測したデータは、違う文脈では意図していない意味を持っているかもしれない

 

教訓:

  1. 早めにテスト・頻繁にテストする

  2. 複数のメトリクスを用意

  3. プロダクトが持つべき制約を意識してモデリングする

Fairness by Design

Fairness by Design

プロダクトのデザインによって公平性を損ねる場合がある

 

対策:

  1. 文脈次第で意味が変わる場合がある

  2. 多様な背景を持ったユーザからフィードバックを受ける

  3. 多様なユーザに合わせた体験を提供する

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 で管理される

https://github.com/dart-lang/language

  • 拡張メソッド (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 参加報告資料

  • 921