やまメモ

やまげんによるやまげんのためのメモ

UbuntuのバージョンによってVimとNeovimを使い分ける(自分用メモ)

はじめに

所属している学生団体で使用しているライブラリにUbuntu14.04でしか動かないものがあり仕方がなくUbuntu14.04を使用していましたが、 大学の研究室ではUbuntu16.04でも困らないので今回はUbuntu14.04とUbuntu16.04のデュアルブート環境を構築してみました。
今回はその際に起きた問題や解決策を自分用にメモしていきます。

問題その1.Ubuntu14.04でNeovimが動かない。

GitHubのリンクとVimの設定(自分用メモ) - やまメモ

に書いたように、自分はVim8.0をビルドして使っていたのですが、どちらでも同じ環境を使えるようにUbuntu14.04にNeovim Unstable版をインストールしてみました。

しかし、なぜかNormal, Insertの表記やカーソルが文字化けし、まともに入力ができない状態になってしまいました。
この件については色々調べましたが、他の方はこの問題は起きていないのかあまり解決策がヒットせず、 結局Ubuntu14.04にNeovimをインストールすることは諦めました。
解決方法知っている方がいれば教えてください。

問題その2.Vimpythonのパッケージ補完をすると動作が重たくなる

これは、解決方法はないのですが、VimにNeocomplete.vim, jedi-vimの組み合わせでかなり大きなPythonのパッケージ(NumpyとかPandasとか)の補完 をしようとすると処理に時間が掛かり、その間ユーザーは操作することができなくなってしまいます。
この件について、一定時間で処理を返すようにはできないのかネット上で質問してみたところ、なんとNeocomplete.vim作者のShougoさんから回答が返ってきました。
Shougoさんによると、

残念ながら、neocomplete では無理です。 それを実現するにはマルチスレッドかマルチプロセス化しなければいけないからです。 jedi-vim の補完はシングルスレッドなので、もし neocomplete がマルチスレッド化してもやはり止まってしまいます。 neovim をお使いなら deoplete.nvim + deoplete-jedi を使うと状況は多少改善されると思います。deoplete-jedi にはキャッシュ機能や補完のタイムアウトがあります。

ということでしたのでこの問題についてはこれ以上の解決方法がないという結論に至りました。

以上の問題から、Ubuntu14.04ではVim8.0、Ubuntu16.04ではNeovimを使用し、できるだけ環境を同じにしようと思います。

プラグインのリンクはこちらです↴

github.com github.com

GitHubのリンクとVimの設定(自分用メモ)

ここに自分のGitHubへのリンクとVimの設定で調べたことを書いていきます。

github.com

VIM - Vi IMproved 8.0を使用しています。

vim-jp.org こちらを参考にlua, python3を有効にしました。

—インストール方法
$ sudo apt-get build-dep vim
$ sudo apt-get install git gettext libncurses5-dev libacl1-dev libgpm-dev
$ sudo apt-get install libperl-dev python-dev python3-dev ruby-dev
$ sudo apt-get install lua5.2 liblua5.2-dev
$ sudo apt-get install luajit libluajit-5.1
$ sudo apt-get install autoconf automake cproto
$ git clone https://github.com/vim/vim.git
$ ./configure --with-features=huge --enable-perlinterp --enable-pythoninterp --enable-python3interp --enable-rubyinterp --enable-luainterp --with-luajit --enable-fail-if-missing
$ make
$ sudo make install

これからインストールする予定のプラグインとインストールしたプラグイン一覧

— インストールするプラグイン

GitHub - justmao945/vim-clang: Clang completion plugin for vim

vim-clangはC++補完を効かせるのに必要。なぜかうまくインストールできないので調べ中。。。

— 2017/08/04追記 —
どうやらclangのコンパイルオプションの設定が悪かったみたい…。
dein.vimのlazy.tomlの設定の
let g:clang_cpp_options = '-std=c++1y -stdlib=libc++'

let g:clang_cpp_options = '-std=c++1y'
に変えたところうまく動いた。

Ubuntu14.04にlibc++をインストールしたけど上の設定では挙動が変(遅い、補完候補がたまに違うものに変わる…?)なので調査中…。
sudo apt-get install libc++-dev

— 追記ここまで —

— インストールしたプラグイン

Vimメモ : jedi-vimでPythonの入力補完 - もた日記

このサイトを参考にjedi-vimをインストールしました!

$HOME/.cache/dein/repos/github.com/davidhalter/jedi-vimの中で $ git submodule update --initをするの忘れない。

他にもインストールしたプラグインがあるので随時更新します。

新しいデスクトップPC購入しました!!

新しいデスクトップを購入しました!!

—スペック—
CPU: Core i7 7700K
GPU: GeForce GTX 1070(8G)
メモリ: 8GB
SSD: 240GB
HDD: 1TB

来週あたりに届くから楽しみ!
届いたら早速Ubuntuインストール!

やっとChainerが動いた!!

一日調べまくってやっとChainerが動きました.

ソースコードはこちら↴

# -*- coding: utf-8 -*-
import numpy as np
import chainer
from chainer import cuda, Function, gradient_check, report, training, utils, Variable
from chainer import datasets, iterators, optimizers, serializers
from chainer import Link, Chain, ChainList
import chainer.functions as F
import chainer.links as L
from chainer.training import extensions


class Model(Chain):

    def __init__(self, n_units, n_out):
        super(Model, self).__init__(
            l1=L.Linear(None, n_units),
            l2=L.Linear(None, n_units),
            l3=L.Linear(None, n_units),
            l4=L.Linear(None, n_out),
        )

    def __call__(self, x):
        h1 = F.relu(self.l1(x))
        h2 = F.relu(self.l2(h1))
        h3 = F.relu(self.l3(h2))
        return F.relu(self.l4(h3))



def main():

    epoch = 200

    model = Model(64, 1)
    optimizer = optimizers.Adam()
    optimizer.use_cleargrads()
    optimizer.setup(model)

    is_gpu = True
    if(is_gpu):
        gpu_device = 0
        cuda.get_device(gpu_device).use()
        model.to_gpu(gpu_device)
        xp = cuda.cupy
    else:
        xp = np

    data = []
    for i in range(1, 10):
        for j in range(1, 10):
            data.append([xp.array([i, j], dtype=xp.float32),
                         xp.array([i * j], xp.float32)])

    loss = None
    for i in range(epoch):
        for x, t in data:
            model.cleargrads()
            y = model(Variable(x.reshape((1, 2))))
            t = Variable(t.reshape((1, 1)))
            loss = F.mean_squared_error(y, t)
            loss.backward()
            optimizer.update()
        print("epoch = ", i, " / ", end="")
        print("loss = ", loss.data)

    # テスト
    flag = True
    while(flag):
        print("数値: ")
        one = int(input())
        two = int(input())
        d = xp.array([one, two], dtype=xp.float32)
        answer = model(Variable(d.reshape((1, 2))))
        print("答え = ", answer.data)


if __name__ == '__main__':
    main()

入力に掛け算の数字([1, 1], [1, 2], …, [6, 7], …, [9, 9])
正解データにその答え([1], [2], …, [42], …, [81])
を与えている.

ChainerのTrainerが分からない...

この一週間, Docmentや他の紹介記事を見てChainerの使い方を勉強していたが
Trainerの使い方が意味不明…

試しに掛け算を学習させてみようと思い
入力データとして[1, 1], [1, 2], …, [9, 9]のVariableと
正解データとして[1], [2], …, [81]のVariableを用意してみた.

恐らくTrainerを使わずに実装するとあっさり動くんだろうけどなんとしてもTrainerを使ってみたい.

# -*- coding: utf-8 -*-
import numpy as np
import sys
import chainer
from chainer import cuda, Function, gradient_check, report
from chainer import training, utils, Variable
from chainer import datasets, iterators, optimizers, serializers
from chainer import Link, Chain, ChainList
import chainer.functions as F
import chainer.links as L
from chainer.training import extensions


class MyChain(Chain):

    def __init__(self, n_units, n_out):
        super(MyChain, self).__init__(
            l1=L.Linear(None, n_units),
            l2=L.Linear(None, n_units),
            l3=L.Linear(None, n_out),
        )

    def __call__(self, x):
        h1 = F.relu(self.l1(x))
        h2 = F.relu(self.l2(h1))
        return F.relu(self.l3(h2))


def main():
    is_gpu = True  # CPUの場合はFalse
    xp = cuda.cupy if is_gpu else np

    batchsize = 3
    model = MyChain(32, 1)

    # x_data : トレーニングデータ
    # t_data : 正解データ
    x_data = []
    t_data = []
    for i in range(1, 10):
        for j in range(1, 10):
            x_data.append(Variable(xp.array([i, j], dtype=xp.float32)))
            t_data.append(Variable(xp.array([i * j], dtype=xp.float32)))

    # 最適化
    opt = optimizers.Adam()
    opt.use_cleargrads()
    opt.setup(model)

    train_iter = chainer.iterators.SerialIterator(x_data, batchsize)
    updater = training.StandardUpdater(train_iter, opt)
    trainer = training.Trainer(updater, (2000, 'epoch'), out='result')
    trainer.run()


if __name__ == '__main__':
    main()

一度Trainer使わずやってみようかな.

PCのスペック紹介

今使っているデスクトップPCのスペック

 

CPU : intel core i5-4590

グラボ : GeForce GTX 960

メモリ : 8GB

OS Ubuntu 14.04

 

機械学習やるならスペック足りないぽいけど今は困ってないので気にしない.