栄達の神は待たない

とある大学生が自らの技術力の向上と知識を得るモチベーションUPのための自己満ブログ。

TensorFlow-GPUをインストールしてみた

環境

前提

  • anaconda入ってる

  • すでにTensorFlowでいろいろやってた

インストール手順(ざっくりと)

  1. Visual Studio 2017をMicrosoft からダウンロード。exeを起動しインストール

  2. CUDAとCUDNNをNVIDIAからダウンロード

  3. CUDAはそのままexeを起動してインストール

  4. CUDNNを解凍

  5. 解凍して出てきたbinフォルダたちをC:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.2 内に上書きコピー

  6. anaconda promptを起動して以下コマンドを実行

activate 仮想環境名
pip uninstall tensorflow
conda install tensorflow-gpu

以上で完了。

その後

tennsorflow自体はできているはずなのだが

# kの更新に利用するパラメータ
GAMMA = 0.5
LR_K = 0.001

# 繰り返し数。100000〜1000000程度を指定
TOTAL_STEPS = 100

# モデルや確認用の生成画像を保存するディレクトリ
MODEL_SAVE_DIR = 'began/models'
IMG_SAVE_DIR = 'began/imgs'
# 確認用に5x5個の画像を生成する
IMG_SAMPLE_SHAPE = (5, 5)
N_IMG_SAMPLES = np.prod(IMG_SAMPLE_SHAPE)


# 保存先がなければ作成
os.makedirs(MODEL_SAVE_DIR, exist_ok=True)
os.makedirs(IMG_SAVE_DIR, exist_ok=True)

# サンプル画像用のランダムシード
sample_seeds = np.random.uniform(
    -1, 1, (N_IMG_SAMPLES, z_size)
)

history = []
logs = []

for step, batch in enumerate(train_data_generator):
    # サンプル数がBATCH_SIZEに満たない場合はスキップ
    # 全体の画像枚数がBATCH_SIZEの倍数出ない場合に発生
    if len(batch) < BATCH_SIZE:
        continue
    
    # 学習終了
    if step > TOTAL_STEPS:
        break

    # ランダムな値を生成
    z_g = np.random.uniform(
        -1, 1, (BATCH_SIZE, z_size)
    )
    z_d = np.random.uniform(
        -1, 1, (BATCH_SIZE, z_size)
    )
    
    # 生成画像(discriminatorの学習に利用)
    g_pred = generator.predict(z_d)
    
    # generatorを1ステップ分学習させる
    generator.train_on_batch(z_g, batch)
    # discriminatorを1ステップ分学習させる
    _, real_loss, fake_loss = discriminator_trainer.train_on_batch(
            [batch, g_pred],
            [batch, g_pred]
    )

    # k を更新
    k_var += LR_K*(GAMMA*real_loss - fake_loss)
    K.set_value(k, k_var)
    

    # g_measure を計算するためにlossを保存
    history.append({
        'real_loss': real_loss,
        'fake_loss': fake_loss
    })

    # 1000回に1度ログを表示
    if step%1000 == 0:
        # 過去1000回分の measure を平均
        measurement = np.mean([
            measure(
                loss['real_loss'],
                loss['fake_loss'],
                GAMMA
            )
            for loss in history[-1000:]
        ])
        
        logs.append({
            'k': K.get_value(k),
            'measure': measurement,
            'real_loss': real_loss,
            'fake_loss': fake_loss
        })
        print(logs[-1])

        # 画像を保存  
        img_path = '{}/generated_{}.png'.format(
            IMG_SAVE_DIR,
            step
        )
        save_imgs(
            img_path,
            generator.predict(sample_seeds),
            rows=IMG_SAMPLE_SHAPE[0],
            cols=IMG_SAMPLE_SHAPE[1]
        )
        # 最新のモデルを保存
        generator.save('{}/generator_{}.hd5'.format(MODEL_SAVE_DIR, step))
        discriminator.save('{}/discriminator_{}.hd5'.format(MODEL_SAVE_DIR, step))

このサンプルプログラムを実行すると

InternalError: Blas GEMM launch failed : a.shape=(16, 32), b.shape=(32, 4096), m=16, n=4096, k=32
     [[{{node dense/MatMul}} = MatMul[T=DT_FLOAT, transpose_a=false, transpose_b=false, _device="/job:localhost/replica:0/task:0/device:GPU:0"](_arg_dense_input_0_0/_143, dense/MatMul/ReadVariableOp)]]
     [[{{node conv2d_8/BiasAdd/_145}} = _Recv[client_terminated=false, recv_device="/job:localhost/replica:0/task:0/device:CPU:0", send_device="/job:localhost/replica:0/task:0/device:GPU:0", send_device_incarnation=1, tensor_name="edge_158_conv2d_8/BiasAdd", tensor_type=DT_FLOAT, _device="/job:localhost/replica:0/task:0/device:CPU:0"]()]]

エラーが起きてしまう。

ほかのプログラムを試してみても

 Blas GEMM launch failed

というエラーが起きる。

今日は目が疲れたので明日続きをやろうと思う。

今日のまとめ

Tensorflow-GPUの使い方が分からねぇぇぇぇぇぇ (ゲームならGPU簡単に設定されるけど、プログラムにどうやって適応すればええの?)