한국의 개발자들을 위한 Google for Developers 국문 블로그입니다.
TensorFlow 2.0을 출시했습니다.
2019년 10월 10일 목요일
<블로그 원문은
이곳
에서 확인하실 수 있으며 블로그 번역 리뷰는 박해선(MachineLearning GDE)님이 참여해 주셨습니다>
올해 초,
TensorFlow Dev Summit
에서 TensorFlow 2.0 알파 버전을 발표했습니다. 기쁜 마음으로 TensorFlow 2.0의 최종 릴리스 출시를 발표합니다.
여기
에서 TensorFlow 2.0의 설치 방법을 알아보세요.
TensorFlow 2.0은 커뮤니티의 주도로 나온 결과물입니다. 사용자들이 원하는 유연하고 강력하며 어떤 플랫폼에도 배포 가능한 사용하기 간편한 플랫폼입니다. TensorFlow 2.0은 최신 머신러닝 기술을 추구하고 확장 가능한 ML 기반 애플리케이션을 만드는 개발자, 기업, 연구자를 위한 광범위한 도구 생태계를 제공합니다.
TensorFlow 2.0을 사용한 개발
TensorFlow 2.0을 사용하면 ML 애플리케이션을 훨씬 더 쉽게 개발할 수 있습니다.
Keras와 TensorFlow
의 통합,
즉시 실행
(eager execution)(기본 설정), 파이썬 함수 실행(execution)을 통해 TensorFlow 2.0은 Python 개발자에게 최대한 익숙한 애플리케이션 개발 경험을 제공합니다. ML의 경계를 허무는 연구자를 위해 TensorFlow의 저수준 API에 많은 투자를 해왔습니다. 이제 내부에서 사용하는 모든 연산을 외부로 공개하고 변수 및 체크포인트(checkpoint)와 같은 중요한 개념을 위해 상속 가능한 인터페이스를 제공합니다. 이를 통해 TensorFlow를 다시 빌드할 필요 없이 TensorFlow의 내부 구조 위에 시스템을 구축할 수 있습니다.
우리는 클라우드, 웹, 브라우저, Node.js, 모바일 및 임베디드 시스템을 비롯한 다양한 런타임(runtime)에서 모델을 실행할 수 있도록,
SavedModel
파일 형식을 표준화했습니다. 그 덕분에 TensorFlow로 모델을 실행하고,
TensorFlow Serving
으로 모델을 배포하고,
TensorFlow Lite
로 모바일 및 임베디드 시스템에서 모델을 사용하고,
TensorFlow.js
로 브라우저나 Node.js에서 훈련하고 실행할 수 있습니다.
고성능 훈련 시나리오의 경우,
분산 전략(
Distribution Strategy) API
를 사용하여 최소한의 코드 변경만으로 훈련을 분산하고 별도의 구성 없이 바로 우수한 성능을 달성할 수 있습니다. Keras의 Model.fit 메서드와 맞춤 훈련 루프도 분산 훈련을 지원합니다. 현재
다중 GPU 지원
이 제공되며,
여기
서 Google Cloud에서 GPU를 사용하는 방법에 관해 자세히 알아볼 수 있습니다. 향후 릴리스에서 Cloud TPU 지원을 제공할 예정입니다. 자세한 내용은 분산 훈련
가이드
를 확인해 보세요.
TensorFlow 2.0은 GPU에서 성능이 많이 개선되었습니다. 예를 들어
ResNet-50
과
BERT
에서 TensorFlow 2.0은 몇 줄의 코드로 Volta 및 Turing GPU에서 혼합 정밀도(mixed precision)를 사용해 최대 3배 더 빠른 훈련 성능을 제공합니다. TensorFlow 2.0은 TensorRT와 긴밀히 통합되며
향상된 API
를 사용하여 Google Cloud의
NVIDIA T4 Cloud GPU
를 사용한 추론 시 더 나은 사용성과 높은 성능을 제공합니다.
NVIDIA에서 가속 컴퓨팅 소프트웨어 제품 관리 책임을 맡고 있는 Kari Briski 상무이사는 이렇게 말했습니다. "개발자들은 NVIDIA GPU 및 시스템에서 머신러닝을 통해 불과 몇 년 전만 해도 불가능해 보였던 문제들을 해결할 수 있습니다. TensorFlow 2.0은 훌륭한 GPU 가속 기능으로 가득 차 있는데, 커뮤니티에서 향상된 이 도구로 만들어낼 놀라운 AI 애플리케이션을 한시라도 빨리 보고 싶습니다."
TensorFlow에서 모델을 효율적으로 만들기 위해서는 훈련 데이터와 검증 데이터를 손쉽게 얻는 것이 가장 중요합니다. 이를 위해 이미지, 텍스트, 동영상 등의 다양한 데이터 형식을 포함한 방대한 데이터세트에 대한 표준 인터페이스를 제공하는
TensorFlow Datasets
를 제공합니다.
전통적인 Session 기반 프로그래밍 모델이 계속 유지되겠지만, 즉시 실행을 사용한 일반적인 파이썬 개발 방식을 사용하는 것이 좋습니다.
tf.function
데코레이터를 사용하여 코드를 그래프로 변환하여 원격으로 실행하거나 직렬화하고 성능을 최적화할 수 있습니다. 일반적인 파이썬 제어 흐름을 TensorFlow 제어 흐름으로 직접 변환할 수 있는
Autograph
가 이를 보완해 줍니다.
물론, TensorFlow 1.x를 사용자가 2.0으로 이전하기 위한 가이드를 찾고 있다면,
여기
에 알맞은 정보를 게시해 두었습니다. TensorFlow 2.0 릴리스에는 처음 시작할 때 도움이 될만한 자동 변환 스크립트도 포함되어 있습니다.
Google 내부와 TensorFlow 커뮤니티의 많은 사용자와 함께 협력하여 TensorFlow 2.0 기능을 테스트하고 소중한 의견을 통해 많은 도움을 받았습니다. 한 예로서, Google 뉴스 팀은 TensorFlow 2.0으로 BERT 기반의 언어 이해 모델을 출시해
기사 이해 범위를 대폭 넓혔습니다
. TensorFlow 2.0은 새로운 아이디어를 빠르게 구현할 수 있는 유연하고 사용하기 간편한 API를 제공합니다. 모델 훈련과 배포가 기존 인프라에 끊김없이 통합되었습니다.
또한 ML은 파이썬 개발자만을 위한 것이 아닙니다.
TensorFlow.js
를 사용하여 자바스크립트 개발자가 훈련 및 추론 기능을 수행할 수 있으며,
Swift for TensorFlow
라이브러리로 모델을 빌드하기 위한 언어인 Swift에 계속 투자하고 있습니다.
소개할 것이 정말 많습니다. 이를 위해
TensorFlow 2.0의 모든 새로운 기능을 효과적으로 활용하는 방법
에 관한 편리한 가이드를 만들었습니다. TensorFlow 2.0을 보다 더 쉽게 시작할 수 있도록, 우리는
여기
에서 2.0 API를 사용하여 널리 사용되는 여러 가지 ML 모델의 참조 구현을 제공합니다.
그뿐 아니라,
deeplearning.ai
및
Udacity
와 함께 만든 온라인 과정을 확인해 보면 TensorFlow 2.0을 사용하여 애플리케이션을 빌드하는 방법을 배울 수 있습니다.
빨리 시작하려면
Google Cloud의 딥러닝 VM 이미지
를 사용하세요. TensorFlow 2.0 딥러닝 프로젝트를 만드는데 도움이 되도록 사전 구성된 가상 머신으로, 따로 설정할 필요가 없습니다.
자세히 알아보기
TensorFlow 2.0을 다운로드하고 ML 애플리케이션 코딩을 시작하는 방법을 비롯하여, TensorFlow 2.0에 관한 자세한 내용은
tensorflow.org
에서 확인할 수 있습니다. 마지막으로, TensorFlow 2.0과 관련 생태계에 관해 더욱 흥미진진한 각종 발표, 강연, 실습 교육, 프레젠테이션 등을 원하시면, 10월 28일~31일에 캘리포니아 산타클라라에서 열리는
TensorFlow World
에 직접 참가해보세요. 그때 만날 수 있으면 좋겠습니다!
머신러닝으로 버스 지연 예측하기
2019년 10월 2일 수요일
게시자: Alex Fabrikant, Google Research 연구원
원문은
이 곳
에서 확인하실 수 있습니다.
전 세계 수억 명의 사람이 매일 대중교통을 이용해 출퇴근하고 있고, 전 세계 대중교통의 절반 이상을 버스가 담당하고 있습니다. 지구촌의 수많은 도시가 계속 성장함에 따라, 출퇴근하는 사람들은 기다리는 차편, 특히 교통 상황에 따른 영향을 크게 받는 버스 도착 시간의 지연 여부를 정확히 알고싶어 합니다. Google 지도에서 제공하는 대중교통 안내 정보는 수많은 교통 관련 기관에서 실시간으로 제공하는 데이터에 의존하지만, 기술 및 리소스의 제약으로 인해 실시간으로 제공하지 못하는 기관도 많습니다.
현재, Google 지도에서는
버스용 실시간 도착 지연 서비스를 도입
했는데, 애틀랜타부터 자그레브, 이스탄불, 마닐라 등에 이르는 전 세계 수백 개의 도시에서 버스 도착 지연을 예측하는 서비스입니다. 덕분에 6천만 명 이상의 사람이 버스 도착 시간을 더 정확히 알 수 있게 되었습니다.
3주일 전에 인도에서 첫선을 보인
이 시스템은 실시간 자동차 교통 흐름 예측 데이터를 버스 노선 및 정류소 데이터와 결합하여 버스 운행 시간이 얼마나 될지 예측하는 머신러닝 모델로 운영됩니다.
모델의 시작
교통 기관에서 실시간 예측 정보를 제공하지 않는 많은 도시에서는 사람들이 Google 지도 운전 안내 기능을 사용해 버스 지연을 대략적으로 추정하는 현명한 임시방편을 쓴다는 사실을 설문조사를 통해 파악할 수 있었습니다. 하지만 버스는 단순히 덩치가 큰 자동차가 아닙니다. 버스는 정류소에서 정차하고, 일반 자동차보다 가속, 감속, 회전에 시간이 더 걸리면서도 때로 버스 전용 차선처럼 특별한 도로를 사용할 수 있는 특권을 받기도 합니다.
한 가지 예로, 수요일 오후에 시드니에서 버스에 탑승하는 사례를 살펴봅시다. 버스의 실제 운행(파란색)이 공표된 일정(검은색)보다 몇 분 정도 늦어지고 있습니다. 자동차 교통 흐름 속도(빨간색)가 버스 운행에 영향을 주지만(예: 2,000미터 지점에서 감속), 800미터 지점의 정류소에서 정차하는 바람에 일반 자동차에 비해 버스 속도가 상당히 느려지게 됨을 알 수 있습니다.
모델을 개발하기 위해 교통 기관의 실시간 피드에서 받은 데이터를 해당 노선 운행 중 버스 운행 경로에서의 교통 흐름 속도에 맞춰 조정했고, 이를 반영하여 시간의 경과에 따른 버스 위치 시퀀스로부터 훈련 데이터를 추출했습니다. 이 모델은 운행 스케줄 단위의 시퀀스(도로 블록과 정류소 도착)로 분할되며, 각 시퀀스는 버스 운행 스케줄의 한 부분에 해당하고 각 단위에서 시간을 예측합니다. 보고가 자주 이루어지지 않거나 버스가 빨리 움직이거나 블록과 정류소 거리가 짧은 등의 이유 때문에 인접한 한 쌍의 관측 데이터는 대개는 많은 단위에 걸쳐 있게 됩니다.
이 구조는 최근에
음성 처리
,
기계 번역
등에 성공적으로 적용된 것과 같은 신경 시퀀스 모델에 적합합니다. 이 모델은 더 간단합니다. 각 단위에서 시간을 독립적으로 예측하며, 단위별 예측의 합이 최종 출력됩니다. 많은 시퀀스 모델과는 달리, 이 모델에서는 각 단위에서 도출한 결과를 결합할 방법을 학습할 필요, 단위 시퀀스를 통해 state를 전달할 필요도 없습니다. 대신에 시퀀스 구조를 사용하여 공동으로 (1) 개별 단위에서 시간 모델을 훈련하고 (2) 관찰되는 각각의 궤적이 총 시간을 궤적이 걸쳐 있는 많은 단위의 합에 할당하는 'linear 시스템'을 최적화할 수 있습니다.
파란색 정류소에서 출발하는 버스 운행 (a)를 모델링하기 위해, 모델 (b)에서는 파란색 정류소, 세 개의 도로 부분, 흰색 정류소 등에 대해 운행 스케줄 단위에서 지연 예측 값을 합산합니다.
‘위치’ 모델링하기
도로 교통의 지연 외에도, 우리는 모델을 훈련하는 과정에서 버스 노선에 관한 세부 정보뿐 아니라 버스 운행의 위치와 타이밍에 관한 신호도 고려합니다. 소규모 지역 내에서도 모델은 다양한 거리에서 자동차 속도 예측을 버스 속도로 다르게 변환해야 합니다. 아래의 왼쪽 패널에는 한 버스 운행 노선에 대해 모델에서 예측하는 자동차 속도와 버스 속도 간의 비율이 색으로 표시되어 있습니다. 빨간색에 더 가깝고 더 느려지는 부분은 정류소 근처에서 버스가 감속하기 때문에 그렇게 표시될 수 있습니다. 상자로 강조표시한 부분에서 빠른 속도를 나타내는 녹색 구간의 경우, 모델이 버스 전용 회전 차선을 발견했으며 이는 스트리트 뷰(오른쪽)에서도 확인할 수 있습니다. 그런데 이 노선은 우회전이 좌회전보다 느린 호주에 있는 노선으로, 해당 지역의 특색을 고려하지 않는 모델에서는 놓치게 되는 또 다른 측면입니다.
특정 거리, 인근 지역, 도시의 고유한 특성을 포착하기 위해, 운행 스케줄 단위의 지리 정보(도로 또는 정류소의 정확한 위치)가 다양한 축척으로 해당 위치의 삽입 데이터의 합으로 모델에 표시되는 상태에서, 우리는 모델이 다양한 크기의 지역에 대한 표시의 계층 구조를 학습하도록 합니다. 먼저 특수한 사례를 이용해 더욱 세분화된 위치에 대해 점진적으로 더 큰 페널티를 부과하며 모델을 훈련하고, 특징 선택(feature selection)에 대한 결과를 사용합니다. 그와 같이 세분화된 특징이 거의 문제가 되지 않는 교외의 개활지와는 반대로, 이를 통해 100미터의 거리도 버스의 움직임에 영향을 미칠 정도로 충분히 복잡한 지역에서 세분화된 특징이 고려되도록 할 수 있습니다.
또한 훈련 시에 훈련 데이터에는 없었던 지역에 대해 이후에 쿼리가 있을 가능성도 시뮬레이션합니다. 각 훈련 배치에서 예시를 임의로 자른 조각을 선택하고 각 조각에 대해 임의로 선택한 눈금 미만의 지리적 특징은 삭제합니다. 일부 예시는 정확한 버스 노선 및 거리와 함께 유지되고, 다른 예시는 인근 지역이나 도시 수준의 위치만 유지하며, 또 다른 예시에는 아예 지리적 컨텍스트가 없습니다. 그러면 훈련 데이터에 관련 내용이 없거나 부족한 지역에 관한 이후의 쿼리에 대한 모델의 준비 수준을 더 높일 수 있습니다. 우리는 Google 지도가
업무상 붐비는 시간
,
주차 곤란
및 기타 특징에 대해 사용하는 것과 동일한 데이터셋에서 사용자의 버스 이용에 관해 익명화된 추론을 사용하여 훈련 자료의 범위를 확장합니다. 하지만 이 데이터에는 전 세계 버스 노선 대다수가 포함되지 않으므로, 우리의 모델은 새 지역으로 확고하게 일반화해야 합니다.
지역적 특색 학습
도시와 인근 지역은 저마다 다른 생활 리듬으로 움직이므로, 모델이 위치 표시를 시간 신호와 결합할 수 있도록 허용합니다. 버스는 시간에 대해 복잡한 종속성을 가집니다. 예컨대, 화요일 오후 6시 30분에서 오후 6시 45분 사이의 시간대에 일부 인근 지역에서는 러시아워의 교통 혼잡이 진정 기미를 보이는 반면에, 다른 인근 지역에서는 저녁 약속으로 사람들이 분주하게 모여드는 시간대일 수 있고, 또 다른 곳은 완전히 적막한 느낌을 주는 마을도 있을 것입니다. 우리의 모델은 특정 지역의 하루 중 몇 시인지, 일주일 중 무슨 요일인지와 같은 신호의 임베딩을 학습하는데, 이를 위치 표시와 결합하면 자동차 교통량을 통해서는 관찰할 수 없는 러시아워의 버스 정류장 혼잡과 같은 두드러진 지역별 변화를 포착할 수 있습니다.
이 임베딩은 하루의 각 시간대에 4차원 벡터를 할당합니다. 대부분의 신경망 내부 구조와는 달리, 4차원은 거의 시각화하기에 충분하지 않으므로, 모델이 아래와 같은 예술적 렌더링을 통해 이러한 차원 중 세 차원에서 하루의 시간을 어떻게 배열하는지 살펴봅시다. 이 모델은 실은 시간이 순환적이라는 점을 학습하여 시간을 '루프' 형태로 배치합니다. 그러나 이 루프는 시계 앞면의 평평한 원 모양이 아닙니다. 모델은 버스 움직임의 변화에서 많은 특징을 잡아낼 수 없는 '한밤중'이나 '늦은 오전'과 같이, 다른 뉴런이 개념을 쉽게 구분할 수 있는 간단한 규칙을 만들 수 있도록 하는 넓은 굴곡부를 학습합니다. 반면에, 저녁의 퇴근 패턴은 인근 지역과 도시 간에 훨씬 더 큰 차이를 보이며, 모델은 오후 4시부터 오후 9시 사이에 더욱 복잡하고 '찌그러진' 패턴을 생성하는 것으로 보이는데 이를 통해 각 도시의 러시아워 타이밍에 관해 더욱 난해하고 복잡한 추론이 가능합니다.
모델의 시간 표시(4가지 차원 중 3가지)가 루프를 형성하는데, 여기서는 시계의 원주로 재구성했습니다. 오후 4시~9시 및 오전 7시~9시와 같이 위치에 더욱 종속적인 시간 범위는 더 복잡하게 '찌그러지는' 반면에, 오전 2~5시와 같은 특징이 없는 큰 범위는 더 간단한 규칙에 맞게 완만하게 표시됩니다. ( textures.com에서 구한 텍스처와 hdrihaven에서 구한 HDRI 사용한 Will Cassella의)
다른 신호와 함께, 이런 시간 표시를 통해 자동차 속도를 일정하게 유지하더라도 복잡한 패턴을 예측할 수 있습니다. 예를 들어 뉴저지를 관통하는 10km 거리의 버스에 탑승한 경우를 가정하여, 우리 모델에서는 점심시간에 거리로 나오는 인파와 평일의 러시아워를 선택합니다.
종합적으로 살펴보기
모델을 완전히 훈련한 상태에서 위의 시드니 버스 탑승에 관해 학습한 내용을 살펴봅시다. 당일의 자동차 교통 데이터를 기반으로 모델을 실행하면 아래와 같이 녹색으로 예측 결과를 얻을 수 있습니다. 이 모델이 모든 걸 포착하지는 못합니다. 예를 들어 버스는 적어도 31초 이상 정지했지만 800미터 지점에 있는 정류소에서 머문 시간은 10초에 불과합니다. 그러나 우리의 예측 모델이 실제 버스 이동과는 1.5분 이내의 범위에서 오차를 유지하므로, 해당 버스 운행에 관해 운행 스케줄이나 자동차 주행 시간만으로 주어지는 정보에 비해 훨씬 많은 뉘앙스를 포착하는 셈입니다.
앞으로의 여정
현재로선 우리 모델에 한 가지가 없죠? 버스 운행 스케줄 자체 말입니다. 지금까지는 기관에서 제공하는 공식 버스 운행 스케줄을 포함하여 실험한 결과, 예측 결과를 현저히 개선하는 효과는 없었습니다. 어떤 도시에서는 교통 상황의 변동이 워낙 심해 스케줄 계획을 세우려는 시도 자체가 무의미할 수도 있습니다. 반면에 다른 도시에서는 버스 스케줄이 정확히 지켜질 수 있지만, 그건 아마 교통 기관에서 교통 패턴을 신중하게 고려하기 때문일 것입니다. 그리고 우리는 데이터로부터 그러한 점을 추론합니다.
우리는 계속해서 스케줄의 제약 조건과 다른 많은 신호를 더 나은 방식으로 실험하면서 더욱 정확하게 시간을 예측하여 사용자가 더 쉽게 여정을 계획할 수 있도록 하겠습니다. 또한, 우리가 여러분의 편안한 여행길에 유익한 존재이길 바랍니다. 즐거운 여행길 되시길!
감사의 말
이번 작업은 Google Research의 James Cook, Alex Fabrikant, Ivan Kuznetsov, Fangzhou Xu와 Google 지도의 Anthony Bertuca, Julian Gibbons, Thierry Le Boulengé, Cayden Meyer, Anatoli Plotnikov, Ivan Volosyuk가 공동으로 진행했습니다. Senaka Buthpitiya, Da-Cheng Juan, Reuben Kan, Ramesh Nagarajan, Andrew Tomkins에게 감사드리고, 특히 지원과 큰 도움이 된 토론에 아낌없는 성원을 보내주신 Transit 팀에 감사드립니다. 또한 모델의 시간 임베딩을 다시 생각해보는 데에 영감을 주신 Will Cassella에게도 감사의 인사를 드립니다. 시스템 훈련의 기초가 된 교통 데이터 피드를 제공해주신 관련 기관에도 많은 신세를 졌습니다.
지금 Android에서는: 에피소드 #3
2019년 9월 30일 월요일
<블로그 원문은
이곳
에서 확인하실 수 있으며 블로그 번역 리뷰는 노현석(Android GDE)님이 참여해 주셨습니다>
Android Studio 3.5, I/O 앱 소스 코드 그리고 애니메이션
파도를 잡아라
<블로그 원문은 이곳에서 확인하실 수 있으며 블로그 번역 리뷰는 신정규(MachineLearning GDE)님이 참여해 주셨습니다>
지난 2주일간 가장 중요한 릴리스는 Google I/O 이후로 베타 버전으로 있다가 이번에 많은 기대를 받으며 선보인 Android Studio 3.5였습니다. 하지만 최근에 Android의 세계에서는 놓치지 말고 체크해봐야 할 다른 일들도 벌어지고 있었습니다.
Android Studio 3.5: 'Project Marble'
훌륭한 IDE는 좋은 친구와도 같습니다. 항상 함께 즐거운 시간을 보내며 날이 갈수록 더 즐거워지는 그런 친구 말입니다. 하지만 여러분의 IDE가 원하는대로 작동하지 않는다면 가끔 좋긴 하나 나를 힘들게 하는 친구인 셈이지요. 그래서 더욱더 기쁜 마음으로
Android Studio 3.5
를 출시했습니다.
이전 릴리스에서, 우리는 지금은 개발자들이 Android Studio에서 사용할 수 있는 새로운 기능에 관해서 이야기했습니다. 하지만 이번 Android Studio 릴리스는 달랐습니다. 개발팀에서는 기본적인 기능 중 몇 가지가 충분히 만족스러운 수준으로 작동하지 않는다는 의견을 들었습니다. 그래서 팀원들은 그때까지 개발 중이던 멋진 새로운 기능은 모두 잠시 제쳐두고 소매를 걷어붙이고서(실은 팀원 대부분이 티셔츠를 입고 다니므로 이마저도 어려운 일임) 버그 수정 모드로 일제히 돌입했습니다.
그 과정에서 다음을 비롯해 수많은 중요한 수정 사항이 있었습니다.
50여 가지 메모리 누수 수정 사항
21가지 IDE 중단 수정 사항*
3x CPU Usage Emulator 개선(백그라운드에서 실행 중인 에뮬레이터가 작동하지 않아 CPU가 고정되는 상황을 종종 목격한 필자에겐 너무나도 소중한 개선 사항)
Windows I/O 개선 사항(참고: 'Windows I/O'는 Microsoft에서 'Google I/O'에 상응하는 개념으로 내놓은 것이 아님)
600여 개의 버그 수정*
*(팀에 이번 릴리스에 관한 최종 통계를 물어봤더니 'IDE 중단 21개, 버그 600개 이상'이라고 알려줬습니다. 필자는 그 의미를 좀 더 캐본 후에야 그 숫자는 중단/버그 *수정 사항*의 수를 뜻한다는 사실을 확인할 수 있었습니다. 휴.)
이번 릴리스에는 XML 편집 중에 자동 완성 기능 중에 중단 문제를 일으킨
이 버그
에 대한 수정 사항도 포함됩니다. 이 문제는
커뮤니티에서 중대한 문제
라는 사실이 분명해지면서 수정 사항 목록에 뒤늦게 추가되었고, 그 때문에 릴리스 발표가 2주일 정도 늦춰졌습니다. (중대한 문제가 있을 때는 꼭 알려주세요. 우리는 귀 기울여 듣고 세심히 살피며, 심지어 새 릴리스의 발표를 코앞에 둔 순간이라도 올바른 일 처리를 위해서는 발표 일정을 미루더라도 중대한 문제는 꼭 해결합니다!)
이번 릴리스에서는 주로 중대한 버그 수정 사항에만 초점을 맞췄지만, Instant Run(다시 작성해 'Apply Changes'로 이름을 바꿈), Data Binding, Annotation Processing을 비롯하여 기존 기능에 대해서도 꼭 필요한 점은 개선했습니다.
이 도구의 몇 가지 특정 개선 사항에 대해 더 자세한 내용을 알고 싶은 분은 팀원들이 이런 개선 사항에 관해 게시한 글을 읽어보시기 바랍니다.
Apply changes
빌드 속도 향상
Android 에뮬레이터
Lint 성능
레이아웃 편집기
개발팀은 Google I/O에서 (도구를 보다 효과적으로 사용하는 방법에 관한 팁과 함께) 도구 개선 사항에 대해 설명했습니다.
여기
에서 (다양한 Android 세션과 함께) 그 내용을 다룬 프레젠테이션을 확인해 보세요.
Jamal의 최근 기사
에서 이번 릴리스에 대해 더 자세한 내용을 읽을 수도 있습니다.
마지막으로, 개발팀이 전체적인 '품질 개선'을 다한 게 아니라는 점을 말씀드리고 싶습니다. 우리가 3.5에서 Android Studio를 상당히 개선했다는 점은 분명하지만(더 빠르고, 부드럽고, 더욱 신뢰할 수 있음), 완벽하지 않다는 것도 잘 알고 있습니다. 그래서 개발팀이 다시 많은 사용자가 필요로 하는 기능을 개발하는 일로 되돌아가더라도 품질 개선 작업 역시 꾸준히 해나갈 것입니다. 향후 릴리스에서 품질 개선에 대해 더 보고해야 할 사항이 있으면 이곳에서 자세한 내용을 읽어보실 수 있을 것입니다.
I/O 세션 애플리케이션 소스 코드
I/O 앱 스케줄링 앱. 올해는 어떤 세션에 참석합니까? 잠깐, 끝난 세션이라고요? 벌써요?
우리는 최근
Google I/O 2019 Android 애플리케이션
의
소스 코드
를 발표했습니다. 여러분도 이미 사용해보셔서 아시는 앱입니다. 어떤 세션이 언제 진행되는지 알아보고, 가고 싶은 세션에 플래그를 지정하고, 많은 사람이 동시에 참석 등록을 하는 바람에 등록하지 못했더라도 나중에 YouTube에서 놓치지 않고 챙겨 보거나 다른 세션에 참석하는 동안 라이브 스트리밍으로 확인하고, 샌드박스에 있는 누군가와 실현 가능한 앱 아키텍처 및 최적의 IDE 구성에 대한 장시간의 대화에 몰두하고, 그러다가 스케줄을 완전히 날려먹고 모든 걸 놓치기도 하는 등, 다양한 경험을 선사했던 바로 그 앱 말입니다.
(사내에서는 'IO Sched'이라 부르는) I/O 앱은 많은 최신 모범 사례와 기술을 통합한 앱으로, Developer Relations 팀으로서는 주요 연간 프로젝트입니다. 예를 들어 올해의 앱에는 Gesture navigation, Dark theme, Navigation 및 Room Architecture Component를 모두 사용되었습니다.
그 취지는 개발자가 학습을 위해 결과 코드를 사용하고 스스로 애플리케이션을 개발할 수 있도록 하는 것이 목적입니다. 바라건대 I/O Schedule 장르에서 약간 더 폭을 넓힐 수 있다면 좋겠습니다. 그래서 우리가 코드를 게시한다면 편리하지 않을까요?
Android 개발자 블로그
에 게시된 Takeshi Hagikura의 기사에서 애플리케이션에 관해 더 자세한 내용을 읽어보실 수 있습니다.
Android Motion 샘플
Animation Motion 샘플 앱
애니메이션은 사용자가 애플리케이션에서 일어나는 일을 이해하도록 돕는 데 무척 중요합니다. 하지만 알맞은 애니메이션 효과를 얻는 것은 까다로울 수 있습니다.
Yuichi Araki가 다양한 애니메이션 효과를 얻는 방법을 보여주기 위해
새로운 Android Motion 샘플
을 작성했습니다. 이 샘플에는 transitions, shared-element transitions, physics animations 등을 보여주는 다양한 데모가 있습니다. 이런 접근 방식과 데모 코드를 사용하면
Material Motion
가이드라인을 더 쉽게 구현할 수 있을 것입니다.
프로의 팁: Android Studio 내에서 직접 Android Motion 샘플을 로드하세요.
대부분의 Android 샘플과 마찬가지로, Android Motion은 IDE에서 직접 사용할 수 있습니다. File -> New -> Import Sample…을 클릭한 다음 Animation 카테고리에서 찾을 수 있습니다.
애니메이션에 관한 이야기…
Nick Butcher
가
Motional Intelligence: Build smarter animations
라는 글을 게시했습니다. 기사 형식으로 자신이 올해 Google I/O에서 진행한 강연을 설명하는 글입니다. 개발자는 어떻게 반응형 프로그래밍 환경에서 애니메이션을 만들어야 할까요? 우리는 매끄럽고 연속적이며 재진입 가능한 모션을 만들기 위해 어떻게 해야 할까요?
자, 그 다음은…
이번 글은 여기까지입니다. Android Studio 3.5를 다운로드하세요! I/O 2019 앱을 사용해보세요! Material과 반응형 애니메이션 코드를 작성하세요! 그리고 곧 이곳으로 다시 와서 Android 개발자 커뮤니티의 다음 업데이트 정보를 확인하세요.
vFlat의 책 스캔에서 TFLite GPU 델리게이트를 사용한 실시간 추론 방법
2019년 9월 23일 월요일
게스트 게시자: 박근우, 김무궁, 한은성
<블로그 원문은
이곳
에서 확인하실 수 있으며 블로그 번역 리뷰는
박해선(MachineLearning GDE)
님이 참여해 주셨습니다>
vFlat의 조감도
다운로드해 사용할 수 있는 모바일 스캐닝 앱이 많이 있지만, 대부분의 앱은 평평한 문서를 디지털화하는 데 초점을 맞추고 있어 책을 펼쳤을 때처럼 굴곡진 페이지는 올바로 스캔하지 못할 때가 많습니다. 텍스트가 인쇄된 곡면 페이지를 스캔할 때, 책이나 출판물의 제본을 아예 뜯어내어 스캔하거나 그냥 있는 그대로의 이미지를 스캔한 후 불편하나마 카메라에서 캡처한 굴곡진 텍스트 이미지를 읽어내는 방법 중에서 선택해야 할 것입니다.
그게 바로 VoyagerX에서 이 문제를 딥러닝으로 해결하기 위해
vFlat
Android 앱을 개발한 이유입니다. vFlat 앱은 사용자가 곡면 페이지에 대해 걱정할 필요 없이 책을 쉽사리 스캔할 수 있도록 하는 것이 목표입니다. 또한 책 페이지의 경계를 자동으로 결정함으로써 사용자의 수동 입력을 줄이고자 합니다.
왼쪽: 일반 모바일 카메라로 캡처한 책의 곡면 페이지 이미지. 오른쪽: vFlat을 사용하여 같은 이미지를 스캔한 버전
사용자가 OCR(광학 문자 인식)을 통해 책 페이지를 찍은 사진에서 텍스트를 추출할 때 이 앱을 사용하면 편리합니다.
위의
‘왼쪽’ 이미지
에서 텍스트를 추출할 때, OCR은 일부 단어와 텍스트 줄이 너무 굴곡져 있기 때문에 올바로 인식하지 못합니다. 하지만 똑같은 OCR 기술을
'오른쪽' 이미지
에 적용하면 훨씬 더 높은 인식 성공률을 보이면서 오류가 거의 없는 텍스트를 추출할 수 있습니다.
vFlat 앱 내에서 이미지 B에 대한 OCR 결과
vFlat 앱의 구축 방법
우리는 곡면의 책 페이지를 평탄하게 하는 딥 러닝 모델을 개발했으며, 최상의 사용자 환경을 제공하기 위해 이 모델을 모바일에서 실행하기로 결정했습니다. vFlat 앱 내부에는 사용자가 평탄해진 책 페이지를 실시간으로 볼 수 있는 '실시간 미리보기' 기능이 있습니다(20FPS 이상). 사용자가 이 앱을 사용하는 것만으로 스캔한 페이지를 실시간으로 평탄한 이미지로 미리 볼 수 있다면 각도와 프레임을 조정한 후 사진을 찍을 수 있을 것입니다.
vFlat의 실시간 미리보기 기능
우리는 모바일 앱에서 실시간 추론을 달성하기 위해 훈련한 모델을 최적화하고 하드웨어 가속의 이점을 활용했습니다. 처음부터 스스로 OpenGL을 사용해 추론 모듈을 구현할 생각이었으므로, GLSL(OpenGL Shading Language)로 모델의 계층을 구현할 준비를 하고 있었습니다.
다행히도, 우리는 TensorFlow Lite의 GPU 지원 기능을 발견해 이를 사용해보기로 했습니다(이 글을 작성하던 당시에
‘tensorflow-lite-gpu’
패키지 버전이 ‘org.tensorflow:tensorflow-lite-gpu:0.0.0-nightly’로 업데이트되었음). 우리는 이 모델의 라이트 버전을 내놓기 위해 가중치 수와 복잡한 연산(ops)을 줄이고 하드웨어 가속을 위해 TFLite GPU 델리게이트(delegate)를 활용했습니다.
GPU는 CPU보다 컴퓨팅 성능이 우수하고 대량의 병렬 작업 부하를 처리할 수 있기 때문에 심층신경망이 매우 잘 맞습니다. 하지만 모바일 GPU를 사용하는 게 간단한 일은 아니며, 바로 이 지점에서 TFLite GPU 델리게이트가 필요합니다.
TFLite GPU 델리게이트는 모바일 GPU를 위한 신경망 그래프를 최적화하고 비동기식으로 실행되는 컴퓨트 셰이더(compute shader)를 생성하고 컴파일합니다. TFLite GPU 델리게이트 덕분에 자체 하드웨어 가속 추론 모듈을 구현할 필요가 없어져 수개월의 개발 시간을 절약했습니다.
TFLite GPU 델리게이트를 사용한 덕분에 시간과 에너지를 아꼈지만, 자체 모델을 TFLite 모델로 변환하고 이를 TFLite GPU 델리게이트와 통합하는 문제에 부딪혔습니다. GPU 델리게이트의 시험용 버전은 주로 MobileNet에 사용되는
연산만 지원
하고 우리가 만든 모델의 일부 연산은 지원하지 않았습니다.
모델의 성능을 저하시키지 않고 GPU 델리게이트를 활용하기 위해, 우리는 전체적인 네트워크 구조는 그대로 똑같이 유지하면서도 일부 연산을 바꾸어야 했습니다. 우리는 변환 과정 중에 어려움을 겪었습니다. 그 시점에는 아직 소스 코드가 공개되지 않았으므로 우리가 만난 오류의 원인을 정확히 짚어내기 힘들었습니다. (TFLite GPU 델리게이트를 위한 코드는 현재
GitHub
에 공개되어 있음)
예를 들어 TFLite GPU 델리게이트는 LeakyReLU 연산을 지원하지 않으므로, 우리는 그 대신에 지원되는 PReLU 연산을 다음과 같은 방식으로 활용해야 했습니다.
변경 전:
> tf.keras.layers.LeakyReLU(alpha=0.3)
변경 후:
> tf.keras.layers.PReLU(alpha_initializer=Constant(0.3), shared_axes=[1, 2], trainable=False)
하지만 PReLU 연산의 파라미터를 모든 축에 공유하여(shared_axes=[1,2,3]) 파라미터를 1개로 줄이려 할 때 예기치 않은 동작이 발생했습니다. 이 코드는 CPU 모드에서는 훌륭하게 작동했지만, GPU 델리게이트는 ‘Linear alpha shape does not match the number of input channels’(선형적인 알파의 크기가 입력 채널 수와 일치하지 않음)라는 오류 메시지와 함께 실패했습니다. 이런 이유 때문에 결국은 축 1과 2만 파라미터를 공유했습니다.
우리가 겪은 또 다른 문제는 네트워크의 Lambda 층에서 입력 데이터를 -1과 1 사이로 정규화할 때 발생했습니다.
> tf.keras.layers.Lambda(lambda x : (x / 127.5) — 1.0)
TFLite 컨버터
로 변환한 Lambda 층의 시각화
이 코드는 GPU 델리게이트에서 작동할 것처럼 보이지만, 실제로 실행해보면 경고 없이 CPU로 대체됩니다. 일반적으로 이런 문제가 발생할 때 TFLite는 'Failed to apply delegate. Only the first M ops will run on the GPU, and the remaining N on the CPU'(델리게이트를 적용하지 못했습니다. 처음 M개의 연산만 GPU에서 실행되고 나머지 N개의 연산=은 CPU에서 실행됩니다.)와 같은 경고 메시지를 표시합니다. 따라서 Lambda 계층을 사용할 때는 주의를 기울여 항상 실제 추론 시간을 측정한 후에 처리해야 합니다.
결론
다양한 Android 기기에 구현한 vFlat 모델의 CPU 추론 시간 대비 GPU 평균 추론 시간
지금까지 여러 가지 장애물이 있었지만, 우리는 TFLite GPU 델리게이트를 사용해 모델의 추론 시간을 절반 이상 단축했습니다. 마침내 평탄한 페이지가 실시간으로 표시되는 '실시간 미리보기' 기능을 사용자에게 제공할 수 있었습니다.
TFLite GPU 델리게이트 사용이 훌륭한 선택이었음을 자신있게 말씀드릴 수 있으며, 휴대기기에 훈련한 모델을 배포하려는 개발자는 TFLite GPU 델리게이트를 사용해보실 것을 적극 추천합니다.
자세히 알아보고 직접 사용해보려면
TensorFlow Lite GPU 델리게이트
를 읽어보세요.
Contents
ML/Tensorflow
Android
Flutter
Web/Chrome
Cloud
Google Play
Community
Game
Firebase
검색
Tag
인디게임페스티벌
정책 세미나
창구프로그램
AdMob
AI
Android
Android 12
Android 12L
Android 13
Android 14
Android Assistant
Android Auto
Android Games
Android Jetpack
Android Machine Learning
Android Privacy
Android Studio
Android TV
Android Wear
App Bundle
bootcamp
Business
Chrome
Cloud
Community
compose
Firebase
Flutter
Foldables
Game
gdg
GDSC
google
Google Developer Student Clubs
Google I/O
Google Play
Google Play Games
Interview
Jetpack
Jetpack Compose
kotlin
Large Screens
Library
ma
Material Design
Material You
ML/Tensorflow
mobile games
Now in Android
PC
Play Console
Policy
priva
wa
wear
Wearables
Web
Web/Chrome
Weeklyupdates
WorkManager
Archive
2026
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2025
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2024
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2023
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2022
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2021
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2020
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2019
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2018
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2017
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2016
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2015
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2014
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2013
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2012
12월
11월
10월
9월
8월
7월
6월
5월
3월
2월
1월
2011
12월
11월
Feed