Mac OS X でTensorflowインストール、Hello world

基本の流れ

$ conda create -n tensorflow
Fetching package metadata ...........
Solving package specifications:
Package plan for installation in environment /Users/kz/anaconda/envs/tensorflow:

Proceed ([y]/n)? y

#
# To activate this environment, use:
# > source activate tensorflow
#
# To deactivate this environment, use:
# > source deactivate tensorflow
#
  • condaの"tensorflow"環境をアクティベート
$ source activate tensorflow
(tensorflow) $
  • pipを使ってインストール(追記アリ)
    • 画面左隅のりんごまーく > About this macGPUを確認して、TF_PYTHON_URLを設定
      • 僕のMacIntel Iris Graphics 6100GPUなので対応範囲外。
$ TF_PYTHON_URL=https://storage.googleapis.com/tensorflow/mac/cpu/tensorflow-1.1.0-py3-none-any.whl
(tensorflow) ~$ echo $TF_PYTHON_URL
https://storage.googleapis.com/tensorflow/mac/cpu/tensorflow-1.1.0-py3-none-any.whl
(tensorflow) ~$ pip install --ignore-installed --upgrade $TF_PYTHON_URL

(omit)
Installing collected packages: six, numpy, pyparsing, packaging, appdirs, setuptools, protobuf, werkzeug, wheel, tensorflow
Successfully installed appdirs-1.4.3 numpy-1.12.1 packaging-16.8 protobuf-3.3.0 pyparsing-2.2.0 setuptools-35.0.2 six-1.10.0 tensorflow-1.1.0 werkzeug-0.12.1 wheel-0.29.0
$ python
Python 3.6.0 |Anaconda custom (x86_64)| (default, Dec 23 2016, 13:19:00)
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.57)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow as tf
>>> hello = tf.constant('Hello, TensorFlow!')
>>> sess = tf.Session()
2017-05-13 14:25:30.045839: W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use SSE4.1 instructions, but these are available on your machine and could speed up CPU computations.
2017-05-13 14:25:30.045866: W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use SSE4.2 instructions, but these are available on your machine and could speed up CPU computations.
2017-05-13 14:25:30.045872: W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use AVX instructions, but these are available on your machine and could speed up CPU computations.
2017-05-13 14:25:30.045877: W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use AVX2 instructions, but these are available on your machine and could speed up CPU computations.
2017-05-13 14:25:30.045882: W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use FMA instructions, but these are available on your machine and could speed up CPU computations.
>>> print(sess.run(hello))
b'Hello, TensorFlow!'

改善

>>> import os
>>> os.environ['TF_CPP_MIN_LOG_LEVEL']='2'
  • OK!
>>> import os
>>> import tensorflow as tf
>>> os.environ['TF_CPP_MIN_LOG_LEVEL']='2'
>>> hello = tf.constant('Hello, TensorFlow!')
>>> sess = tf.Session()
>>> print(sess.run(hello))
b'Hello, TensorFlow!'

疑問点

  • b'Hello, TensorFlow!'b' って何。。。

Anacondaとは?インストール方法

Why?

  • 機械学習の勉強のためにTensorflowを入れようとしたら必要だった

What?

  • 楽にデータサイエンス向けの環境を整えられる
  • AnacondaはPython数値計算環境を構築するためのパッケージをまとめた無料のディストリビューション
  • できること
    • 独自のパッケージ管理システム (conda) を内包
    • Anaconda 上で有効な
      • 環境分離ツール
      • 複数のPython バージョンの切り替え環境

How to install?

$ python --version
Python 3.6.0 :: Anaconda custom (x86_64)
$ python
Python 3.6.0 |Anaconda custom (x86_64)| (default, Dec 23 2016, 13:19:00)
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.57)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy
>>> numpy.__file__
'/Users/kz/anaconda/lib/python3.6/site-packages/numpy/__init__.py'

合わせて読む

Docker

Dockerの利用方法の変化

Kubernetesを使ったBule-Green Deployment

  • 設定ファイル

    • Deployment (高可用性の担保)
      • ある機能を提供するコンテナをどんな構成でデプロイするかの指定
    • Service
      • コンテナに対するネットワークを構成するかの指定
  • Kubernetesのコンテナクラスタ管理の構造

    • マスタ
      • 巨大なリソースプール(1つのクラスタ)として管理
        • 実体は、複数のノード(コンテナホスト)
        • Deploymentの設定をすると、空いているノードを見つけて自動的にデプロイされる
        • 障害があってノードが停止すると、健全なノードで自動的に再起動してくれる
      • ロードバランサ機能で、代表IPアドレスを使って振り分け
        • どのコンテナのどのポートに対して負荷分散するかを指定する
  • Bule-Green Deployment

    • Deployment
      • 既存コンテナと新しいバージョンのコンテナを並行稼動させる
    • Service
      • 外部ユーザのアクセスを既存コンテナへ、内部テストユーザのアクセスを新しいコンテナへ振り分ける
      • テスト完了後に、外部ユーザのアクセスも新しいコンテナへ振り分ける

Dockerの基本機能

  • Dockerイメージ作成機能(Build)

    • プログラム本体, ライブラリ, ミドルウェア, OS, ネットワークの設定などを1つにまとめられる
    • 実体は、アプリ実行に必要なファイル群のディレクトリツリー
    • DockerfileにDockerイメージの構成情報を記載する
    • Dockerfileを元にビルドすると、Dockerイメージになる
    • Docker イメージは、実行環境で動くコンテナのベースになる
  • Dockerコンテナ実行機能(Run)

    • オーバーヘッドが少ないので、既に動作しているOS上でプロセスを実行するのとほぼ同じ速さ
    • Dockerは1つのLinuxカーネルを複数のコンテナで共有
    • コンテナ内で動作するプロセスを1グループとして管理するが、独立している
    • グループごとにそれぞれファイルシステム、ホスト名、ネットワークを割り当て(グループが違うと、ファイルやプロセスにアクセスできない)
  • Dockerイメージ共有機能(Ship)

コンテナ実行環境構築のフルマネージメントサービス

  • コンテナ統合管理ツールの必要性
    • Dockerをマルチホスト環境で成立したクラスタ構成で稼働させるため
    • コンテナ起動停止、ホスト間のネットワーク接続、ストレージの管理、コンテナスケジューリング、監視が必要

GCP

  • 準備
    • プロジェクト作成
      • サービスの利用、アクセス権、支払情報をまとめられる
    • アクセス権設定
      • API Manager > Library > GKE API > Enable
  • コンテナ実行環境構築
    • 構成: 2 Node
    • Console menu > Container Engine > Make Container cluster: 2
  • 無停止バージョンアップ
    • KubernetesのRolling Update機能を使用

アプリデプロイの流れ

  • Dockerfile作成
    • Cloud shellを起動して、コードを取得
    • Dockerコンテナの元になるDockerイメージを指定(FROM命令)
    • 作成者情報(MAINTAINER命令)
    • コマンド実行(RUN命令)
    • ポート関数(EXPOSE命令)
    • デプロイ(ADD命令)
    • サーバ起動(CMD命令)
  • Dockerイメージビルド
    • docker buildでDockerfileからイメージ作成(verタグを付ける)
    • docker imagesで作成済みのイメージが確認できる
  • Dockerイメージの公開
    • Dockerイメージにタグを付ける
    • タグがついたら、Google Container Registryにアップロードできる (gcloudコマンド)
    • Console menu > Container Engine > Container Registryで確認
    • GKEから利用できる状態になった!
  • 初めてのDeploy
    • Cloud shellで認証情報取得(gcloud get-credentials)
    • デプロイ構成情報ファイル(deployment.yaml)の作成、デプロイ先指定
    • コンテナデプロイ設定ファイル (kubectl create -f deployment.yaml)
    • コンテナに外部からアクセスするためのサービス定義ファイル(kubectl create -f service.yaml)
    • EXTERNAL-IP にアクセスして確認する
  • 二回目のDeploy
    • イメージ作成、レジストリアップロード
    • Rolling Udpate機能でバージョンアップ
  • クラスタの停止、削除
    • kubectl delete service web-service -> GLBの設定も破棄
    • kubectl delete deployment web-container
    • Console menue > Container Engine > Container cluster > Delete Docker image

Laravel の新しいプロジェクトの作成

前提

How to

  • Laravel の新しいプロジェクトの作成は、新しいプロジェクトのディレクトリを作成することである

  • Laravel のインストール(数分かかる)

    • git clone して、composer install を動かすのと同じ動きをしている
$ composer create-project laravel/laravel --prefer-dist project_name
$ cd project_name
$ php artisan --version
Laravel Framework 5.4.17

参照

qiita.com

Macにcomposerをbrewでインストール

What?

$ brew install composer
...
Error: No similarly named formulae found.
==> Searching taps...
These formulae were found in taps:
homebrew/php/composer                                             Caskroom/cask/multimarkdown-composer
homebrew/php/composer@1.2                                         Caskroom/versions/multimarkdown-composer-beta
Caskroom/cask/multimarkdown-composer-pro
To install one of them, run (for example):
  brew install homebrew/php/composer

How to?

$ brew install homebrew/php/composer

Macへのgollumインストールでエラー

What?

$ gem install gollum
Fetching: charlock_holmes-0.7.3.gem (100%)
Building native extensions.  This could take a while...
ERROR:  Error installing gollum:
    ERROR: Failed to build gem native extension.

checking for main() in -licui18n... no
checking for main() in -licui18n... no

Why?

  • icu4cライブラリがない

How to resolve?

$ brew install icu4c

参考

ruby - ERROR: Error installing gollum: ERROR: Failed to build gem native extension - Stack Overflow

Laravel5.4: Form作成(illuminate/htmlではなくて、laravelcollective/htmlで)

Why?

  • フォームヘルパーを使うと、Form作るのが楽になる
  • laravelcollective/htmlパッケージをプロジェクトに導入しなくてはならない
    • NG: illuminate/html メンテ止まってる
    • OK: laravelcollective/html メンテされてる
  • Laravel Collective は、Laravel本体から外されたパッケージをメンテするプロジェクト

How to?

laravelcollective/htmlをプロジェクトに追加

  • インストールコマンドでvendorに追加(何気に時間がかかる)
$ composer require laravelcollective/html
  • その結果、composer.json に laravelcollective/html が追加され、インストールもされた
$ cat composer.json
{
    "name": "laravel/laravel",
    "description": "The Laravel Framework.",
    "keywords": ["framework", "laravel"],
    "license": "MIT",
    "type": "project",
    "require": {
        "php": ">=5.6.4",
        "laravel/framework": "5.4.*",
        "laravel/tinker": "~1.0",
        "laravelcollective/html": "^5.4"
    },
...
  • ProviderとAliaseを登録
    'providers' => [
...
        Collective\Html\HtmlServiceProvider::class,
...

    'aliases' => [
...
        'Form' => Collective\Html\FormFacade::class,
        'Html' => Collective\Html\HtmlFacade::class
...

登録フォームの実装

  • Routingを追加(順番注意): routes/web.php
Route::get('articles', 'ArticlesController@index');
Route::get('articles/create', 'ArticlesController@create');
Route::get('articles/{id}', 'ArticlesController@show');
  • Controllerを追加(順番注意): app/Http/Controllers/ArticlesController.php
public function create() {
    return view('articles.create');
}
  • Viewを書く: resources/views/articles/create.blade.php
@extends('app')

@section('content')
  <h1>Write a New Article</h1>
  <hr />

  {!! Form::open(['url' => 'articles']) !!}
    <div class="form-group">
      {!! Form::label('title', 'Title') !!}
      {!! Form::text('title', null, ['class' => 'form-control']) !!}
    </div>
    <div class='form-group'>
      {!! Form::label('body', 'Body') !!}
      {!! Form::text('body', null, ['class' => 'form-control']) !!}
    </div>
    <div class='form-group'>
      {!! Form::submit('Add Article', ['class' => 'btn btn-primary form-control']) !!}
    </div>
  {!! Form::close() !!}
@stop

登録APIの実装

  • Routingを追加(順番注意): app/Http/routes.php
Route::post('articles', 'ArticlesController@store');
  • Controllerを追加
namespace App\Http\Controllers;

use Request;
use App\Article;
use Carbon\Carbon;

class ArticlesController extends Controller
{
    ...
    public function store() {
        $input = Request::all();
        $input['publishd_at'] = Carbon::now();
        Article::create($input);
        return redirect('articles');
    }

逆順ソートで表示

  • リスト表示時にlatestを使う
class ArticlesController extends Controller {
 
    public function index() {
        $articles = Article::latest('published_at')->get();
        return view('articles.index', compact('articles'));
    }
  • vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php
    public function latest($column = 'created_at')
    {
        return $this->orderBy($column, 'desc');
    }

ハマりどころ

参照