在使用GPU
做计算,比如跑Deep Learning
代码的时候,我们可能希望能够实时检测显存的使用情况。
Nvidia
自带了一个名为nvidia-smi
的命令行工具,会显示显存使用情况,但这个命令行工具只能输出一次结果,不支持持续监控输出。
这时候就需要用到watch
命令了.
在使用GPU
做计算,比如跑Deep Learning
代码的时候,我们可能希望能够实时检测显存的使用情况。
Nvidia
自带了一个名为nvidia-smi
的命令行工具,会显示显存使用情况,但这个命令行工具只能输出一次结果,不支持持续监控输出。
这时候就需要用到watch
命令了.
参照Ubuntu 14.04,14.10,16.04编译CPU版本Caffe确保可以正常编译通过CPU
版本的Caffe
.
参照Ubuntu 16.04安装Nvidia CUDA驱动安装Nvidia CUDA
驱动.
参照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
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
中使用下面代码的时候
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
中使用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】
最近在调试脚本时,偶尔会由于脚本错误,出现一批的进程没有结束的情况. 手工结束进程,太浪费时间,因此找到一个可以批量结束同名进程的脚本命令,如下:
$ ps -ef | grep '进程名' | grep -v grep | awk '{print $2}' | xargs kill -9
判断当前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; } ?>
vim
显示行号可以快速的找到代码对应的行。
Ubuntu 16.04 LTS
下,vim
显示行号的命令如下:
$ sudo vim /etc/vim/vimrc
在文件的最后一行增加
set nu
即可。
最近服务器升级到了Ubuntu 16.04 LTS
,结果遇到了与Ubuntu 12.04通过SFTP更新 WordPress相似的问题,界面中没有出现SSH
的选项,只不过目前(2017.06.04
)最新版本的WordPress
(4.7.5
)一直提示的是"无法连接到服务器
",原因依旧是缺少PHP
的SSH
支持库,总结一下解决方法如下:
$ 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
Python
程序在运行时候,可能由于某些原因导致进程卡住在某行代码上,此时我们需要输出进程中各个线程的栈信息。
此时我们需要使用Python
栈工具pstack
的协助,项目的工程地址https://github.com/wooparadog/pstack/
具体的用法如下:
$ sudo pip install pstack $ sudo pstack pid