Ubuntu 16.04命令行监视Nvidia显卡使用情况

在使用GPU做计算,比如跑Deep Learning代码的时候,我们可能希望能够实时检测显存的使用情况。

Nvidia自带了一个名为nvidia-smi的命令行工具,会显示显存使用情况,但这个命令行工具只能输出一次结果,不支持持续监控输出。

这时候就需要用到watch命令了.

继续阅读Ubuntu 16.04命令行监视Nvidia显卡使用情况

Ubuntu 16.04编译GPU(CUDA)版本的Caffe

  • 配置编译环境

参照Ubuntu 14.04,14.10,16.04编译CPU版本Caffe确保可以正常编译通过CPU版本的Caffe.

  • 安装Nvidia CUDA驱动

参照Ubuntu 16.04安装Nvidia CUDA驱动安装Nvidia CUDA驱动.

  • 安装Nvidia CUDNN库

参照Ubuntu 16.04开启dlib对于AVX或者CUDA的支持里面设置Nvidia CUDNN部分,配置好Nvidia CUDNN库.

  • 编译代码
$ cd caffe

$ cmake . -DCUDA_NVCC_FLAGS="-D_FORCE_INLINES"

$ make
  • 编译出错的处理

如果编译时候出现如下错误信息

/usr/include/string.h: In function ‘void* __mempcpy_inline(void*, const void*, size_t)’:
/usr/include/string.h:652:42: error: ‘memcpy’ was not declared in this scope
   return (char *) memcpy (__dest, __src, __n) + __n;
                                          ^
CMake Error at cuda_compile_generated_softmax_layer.cu.o.cmake:266 (message):
  Error generating file
  /home/longsky/Source/caffe/src/caffe/CMakeFiles/cuda_compile.dir/layers/./cuda_compile_generated_softmax_layer.cu.o


src/caffe/CMakeFiles/caffe.dir/build.make:469: recipe for target 'src/caffe/CMakeFiles/cuda_compile.dir/layers/cuda_compile_generated_softmax_layer.cu.o' failed
make[2]: *** [src/caffe/CMakeFiles/cuda_compile.dir/layers/cuda_compile_generated_softmax_layer.cu.o] Error 1
CMakeFiles/Makefile2:272: recipe for target 'src/caffe/CMakeFiles/caffe.dir/all' failed
make[1]: *** [src/caffe/CMakeFiles/caffe.dir/all] Error 2

则需要在执行cmake的时候增加

-DCUDA_NVCC_FLAGS="-D_FORCE_INLINES"

的定义。

  • 编译选项

某些库在使用Nvidia CUDNN的时候会崩溃,此时我们可以在编译的时候,排除Nvidia CUDNN即可。

例子如下:

$ cmake . -DCUDA_NVCC_FLAGS="-D_FORCE_INLINES" -DUSE_CUDNN=OFF

参考链接


ubuntu 16.04中CAFFE配置步骤

Python 2.7在调用自定义类函数时候报错"exceptions.TypeError: 'int' object is not callable"

Python 2.7中按照如下方式定义类

class Rectangle:

    def __init__(self,l):
        self.left = l

    def left(self):
        return self.left

if __name__ == '__main__':
    rect = Rectangle(1)
    print rect.left()

在执行脚本的时候会报告如下错误

Traceback (most recent call last):
  File "test.py", line 11, in <module>
    print rect.left()
TypeError: 'int' object is not callable

造成错误的原因在于Python 2.7中当类的成员变量跟方法名重名的时候,默认是使用类的成员变量,而成员变量是无法被调用的,因而导致报错。

解决方法就是避免方法名跟成员变量同名即可,比如上面的定义修改成如下方式即可

class Rectangle:

    def __init__(self,l):
        self.l = l

    def left(self):
        return self.l

if __name__ == '__main__':
    rect = Rectangle(1)
    print rect.left()

Python 2.7使用multiprocessing报错PicklingError: Can't pickle : attribute lookup __builtin__.instancemethod failed

Python 2.7中使用下面代码的时候

import multiprocessing
 
class examplePool:

    def __init__(self):
        self.pool = multiprocessing.Pool()

    def run(self,args):
        print args

    def runProcessPool(self):
        self.pool.apply(self.run,(60,))
        self.pool.close()
        self.pool.join()

if __name__ == '__main__':
    pool = examplePool()
    pool.runProcessPool()

会报告如下错误:

Traceback (most recent call last):
  File "text.py", line 18, in <module>
    pool.runProcessPool()	
  File "text.py", line 12, in runProcessPool
    self.pool.apply(self.run,(60,))
  File "/usr/lib/python2.7/multiprocessing/pool.py", line 244, in apply
    return self.apply_async(func, args, kwds).get()
  File "/usr/lib/python2.7/multiprocessing/pool.py", line 567, in get
    raise self._value
cPickle.PicklingError: Can't pickle <type 'instancemethod'>: attribute lookup __builtin__.instancemethod failed

这种错误发生的原因是Python 2.7版本中的multiprocessing模块的进程池部分存在BUG,无法正常处理这种写法的代码,据说在Python 3.4版本之后解决了此问题。

目前测试来看,不用Python 2.7中的进程池,而是自己创建进程,自己管理进程的方式,可以比较简单的解决此类问题。

比如代码修改成如下样子,即可正常运行

import multiprocessing
 
class exampleProcess:

    def __init__(self):
        self.process = multiprocessing.Process(target=self.run,args=(60,))

    def run(self,args):
        print args

    def runProcess(self):
        self.process.start()
        self.process.join()

if __name__ == '__main__':
    process = exampleProcess()
    process.runProcess()

至于多进程的管理,则只需要使用

from multiprocessing import Process, Queue

引入multiprocessing模块的Queue,实现一个简单的生产者,消费者模型即可。

参考链接


python multiprocessing遇到Can’t pickle instancemethod问题

WARNING:libav.swscaler:Warning: data is not aligned! This can lead to a speedloss

Python中使用libav视频解码的时候,如果需要更改最后输出的视频的宽高,比如如下代码:

width = 240
container = av.open(url)
video_stream = next(s for s in container.streams if s.type == 'video')
for packet in container.demux(video_stream):
   for frame in packet.decode():
        if frame is None:
            break
        frame = frame.reformat(width,height)
        img = frame.to_image()

可能会收到一条警告信息

WARNING:libav.swscaler:Warning: data is not aligned! This can lead to a speedloss

导致警告的原因是swscaler的缩放的目标尺寸不合适,它预期的大小是16的倍数,这个倍数可以保证swscaler以最高效的方式进行图片的缩放处理。

解决警告的方式就是保证宽高都是16的倍数即可。

参考链接


[swscaler] Warning: data is not aligned! This can lead to a speedloss 的解决方法【FFmpeg】

Ubuntu 16.04 LTS根据进程名结束所有同名进程

最近在调试脚本时,偶尔会由于脚本错误,出现一批的进程没有结束的情况. 手工结束进程,太浪费时间,因此找到一个可以批量结束同名进程的脚本命令,如下:

$ ps -ef | grep '进程名' | grep -v grep | awk '{print $2}' | xargs kill -9

参考链接


Linux Shell脚本实现根据进程名杀死进程

PHP版本判断之version_compare()函数

判断当前PHP的版本是否高于某个版本,或者低于某个版本的方法是使用version_compare()函数。

<?php

header('content-type:text/html;charset=utf-8');
/**
 * 判断php的版本是否在7.0.0以上
 */

echo '<pre>';
 
//本人使用的版本为  7.0.18
echo 'PHP的当前版本为 '.PHP_VERSION."\n";

var_dump(version_compare(PHP_VERSION,'5.2.0'));

var_dump(version_compare(PHP_VERSION,'5.2.0','='));

var_dump(version_compare(PHP_VERSION,'5.3.0','ge'));

if(version_compare(PHP_VERSION,'7.0.0','ge')){

	echo '您的PHP版本大于7.0.0,当前版本为 '.PHP_VERSION;

}else{

	echo '您的PHP版本小于7.0.0,当前版本为 '.PHP_VERSION;

}

?>

参考链接


PHP 版本判断 version_compare() 函数

Ubuntu 16.04 LTS通过SSH2更新WordPress及其插件

最近服务器升级到了Ubuntu 16.04 LTS,结果遇到了与Ubuntu 12.04通过SFTP更新 WordPress相似的问题,界面中没有出现SSH的选项,只不过目前(2017.06.04)最新版本的WordPress(4.7.5)一直提示的是"无法连接到服务器",原因依旧是缺少PHPSSH支持库,总结一下解决方法如下:

$ sudo apt-get install php-ssh2
$ sudo phpenmod ssh2

#如果使用PHP-FPM模块处理PHP协议,则重启PHP-FPM
$ sudo service php7.0-fpm restart

#如果使用Apache2自身的模块处理PHP协议,则重启Apache2
$ sudo service apache2 restart

如果更新或者删除插件的时候提示 "未能找到WordPress插件目录",则参照
Ubuntu 14.04系统WordPress 4.5升级到PHP7之后执行插件升级报错“无法定位WordPress内容目录(wp-content)”中的方法修改即可。

目前(2017.06.09)依然存在的问题是更新插件的时候,提示拷贝出错。查看系统日志

$ cat /var/log/apache2/error.log | grep error

可以看到如下错误信息

'PHP message: PHP Warning:  file_put_contents(ssh2.sftp://Resource id #85/var/www/wordpress/.maintenance): failed to open stream: operation failed in /var/www/wordpress/wp-admin/includes/class-wp-filesystem-ssh2.php on line 253\nPHP message: PHP Warning:  file_put_contents(ssh2.sftp://Resource id #90/var/www/wordpress/wp-content/upgrade/wp-statistics.12.0.7-HJk6Bj/wp-statistics/ajax.php): failed to open stream: operation failed in /var/www/wordpress/wp-admin/includes/class-wp-filesystem-ssh2.php on line 253\n', referer: https://www.mobibrw.com/wp-admin/plugins.php

这个问题属于php-ssh2自身的BUG导致的,问题已经确认并修复,但是还没合并到Ubuntu 16.04 LTS所属的分支上。

目前的解决方法是单独安装Ubuntu 17.04系统上已经编译好的对应系统的deb包,然后手工安装更新。

详细的版本信息可以从Ubuntu php-ssh2 package查询各个系统版本上的关于php-ssh2的包信息。

比如本服务器上更新的命令示例如下:

$ sudo apt-get install php-ssh2

$ wget https://launchpad.net/ubuntu/+archive/primary/+files/php-ssh2_1.0+0.13-2_amd64.deb

$ sudo dpkg -i php-ssh2_1.0+0.13-2_amd64.deb 
$ rm -rf php-ssh2_1.0+0.13-2_amd64.deb

#如果使用PHP-FPM模块处理PHP协议,则重启PHP-FPM
$ sudo service php7.0-fpm restart

#如果使用Apache2自身的模块处理PHP协议,则重启Apache2
$ sudo service apache2 restart

如果外网访问不畅通,也可以从本站下载,示例脚本如下:

$ sudo apt-get install php-ssh2
$ wget https://www.mobibrw.com/wp-content/uploads/2017/06/php-ssh2_1.00.13-2_amd64.deb_.zip
$ unzip php-ssh2_1.00.13-2_amd64.deb_.zip

$ sudo dpkg -i php-ssh2_1.0+0.13-2_amd64.deb 
$ rm -rf php-ssh2_1.0+0.13-2_amd64.deb
$ rm -rf php-ssh2_1.00.13-2_amd64.deb_.zip

#如果使用PHP-FPM模块处理PHP协议,则重启PHP-FPM
$ sudo service php7.0-fpm restart

#如果使用Apache2自身的模块处理PHP协议,则重启Apache2
$ sudo service apache2 restart

参考链接


Ubuntu 16.04下Python打印正在运行的进程的栈信息

Python程序在运行时候,可能由于某些原因导致进程卡住在某行代码上,此时我们需要输出进程中各个线程的栈信息。
此时我们需要使用Python栈工具pstack的协助,项目的工程地址https://github.com/wooparadog/pstack/

具体的用法如下:

$ sudo pip install pstack
$ sudo pstack pid