python使用当中的记录

pytorch中使用指定的GPU:

import os
os.environ["CUDA_VISIBLE_DEVICES"] = "2"

pytorch保存模型:

torch.save(the_model.state_dict(),path)

pytorch加载模型:

the_model = TheModelClass(*args,**kwargs)
the_model.load_state_load(PATH)

第二种保存和加载整个模型:

保存

torch.save(the_model, PATH)

加载:

the_model = torch.load(PATH)

然而,在这种情况下,序列化的数据被绑定到特定的类和固定的目录结构,所以当在其他项目中使用时,或者在一些严重的重构器之后它可能会以各种方式break。

# 保存整个网络
torch.save(net, PATH) 
# 保存网络中的参数, 速度快,占空间少
torch.save(net.state_dict(),PATH)
#--------------------------------------------------
#针对上面一般的保存方法,加载的方法分别是:
model_dict=torch.load(PATH)
model_dict=model.load_state_dict(torch.load(PATH))

os.path.join()函数

语法: os.path.join(path1[,path2[,......]])

返回值:将多个路径组合后返回

注:第一个绝对路径之前的参数将被忽略

python获取对象的所有属性和方法:dir(object)

继续训练transformer-xl的代码:

python train.py --cuda --data '../../data' --dataset 'enwik8' --restart_dir 'LM-TFM-enwik8/20190426-021235' --batch_size 32

创建特定版本的python env:

virtualenv venv --python=python3.6

删除:

rm -r venv

退出虚拟环境:

deactivate

关于zsh-autosuggestion的自动补全,只需要按方向键的右即可自动补全

修改pip为国内的源:

mkdir ~/.pip 
vim ~/.pip/pip.conf

[global]
index-url = https://mirror.baidu.com/pypi/simple
[install]
trusted-host=mirror.baidu.com

[global]
index-url = http://mirrors.aliyun.com/pypi/simple/
[install]
trusted-host = mirrors.aliyun.com

pip国内源:

阿里云 http://mirrors.aliyun.com/pypi/simple/
中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/
豆瓣 http://pypi.douban.com/simple
Python官方 https://pypi.python.org/simple/
v2ex http://pypi.v2ex.com/simple/
中国科学院 http://pypi.mirrors.opencas.cn/simple/
清华大学 https://pypi.tuna.tsinghua.edu.cn/simple/

如果当前外网ip和端口指的是本机的ip和端口,则需要使用127.0.0.1这个ip来指代外网ip,否则会报错Max retries exceeded with ur,这个错误很长,还会因为服务器没有开启也同样报这个错误。

####安装特定版本的pip包:

pip install package==version
#package:包名;version:版本号。如pip install tensorflow-gpu==1.4.0即是安装1.4.0版本的gpu版本的tensorflow

####让docker支持中文

vim ~/.bashrc
#加入下面两行,然后保存,退出docker,重启docker,再进入即可,用source命令也可以。
export LC_ALL=C.UTF-8
export LANG=C.UTF-8

在跑TensorFlow、pytorch之类的需要CUDA的程序时,强行Kill掉进程后发现显存仍然占用,这时候可以使用如下命令查看到top或者ps中看不到的进程,之后再kill掉:

fuser -v /dev/nvidia*

批量清理显卡中残留进程:

sudo fuser -v /dev/nvidia* |awk '{for(i=1;i<=NF;i++)print "kill -9 " $i;}' | sudo sh

with只适用于上下文管理器的调用,除了文件外,with还支持 threading、decimal等模块,当然我们也可以自己定义可以给with调用的上下文管理器

紧跟with后面的语句被求值后,返回对象的 enter() 方法被调用,这个方法的返回值将被赋值给as后面的变量。
当with后面的代码块全部被执行完之后,将调用前面返回对象的 exit()方法。
example:

#!/usr/bin/env python
# with_example01.py
class Sample:
    def __enter__(self):
        print "In __enter__()"
        return "Foo"
    def __exit__(self, type, value, trace):
        print "In __exit__()"
def get_sample():
    return Sample()
with get_sample() as sample:
    print "sample:", sample
    
输出:
In __enter__()
sample: Foo
In __exit__()

要使用 with 语句,首先要明白上下文管理器这一概念。有了上下文管理器,with 语句才能工作。

下面是一组与上下文管理器和with 语句有关的概念。
上下文管理协议(Context Management Protocol):包含方法 enter() 和 exit(),支持该协议的对象要实现这两个方法。

上下文管理器(Context Manager):支持上下文管理协议的对象,这种对象实现了__enter__() 和 exit() 方法。上下文管理器定义执行 with 语句时要建立的运行时上下文,负责执行 with 语句块上下文中的进入与退出操作。通常使用 with 语句调用上下文管理器,也可以通过直接调用其方法来使用。

运行时上下文(runtime context):由上下文管理器创建,通过上下文管理器的 enter() 和__exit__() 方法实现,enter() 方法在语句体执行之前进入运行时上下文,exit() 在语句体执行完后从运行时上下文退出。with 语句支持运行时上下文这一概念。

上下文表达式(Context Expression):with 语句中跟在关键字 with 之后的表达式,该表达式要返回一个上下文管理器对象。

语句体(with-body):with 语句包裹起来的代码块,在执行语句体之前会调用上下文管理器的 enter() 方法,执行完语句体之后会执行__exit__() 方法。

CLS:每个序列的第一个 token 始终是特殊分类嵌入(special classification embedding),即 CLS。对应于该 token 的最终隐藏状态(即,Transformer的输出)被用于分类任务的聚合序列表示。如果没有分类任务的话,这个向量是被忽略的。

SEP:用于分隔一对句子的特殊符号。有两种方法用于分隔句子:第一种是使用特殊符号 SEP;第二种是添加学习句子 A 嵌入到第一个句子的每个 token 中,句子 B 嵌入到第二个句子的每个 token 中。如果是单个输入的话,就只使用句子 A。

在 python 中, 双下划线开头的方法 __xxx 为私有方法,只有类内部可见,单下划线开头的方法 _xxx 相当于其他语言的 protected 方法,仅继承链上的类中可见:

class A():
    def __init__(self):
        print(self.__get_name())
    def _get_name(self):
        return "A"
class B(A):
    def _get_name(self):
        return "B"
if __name__ == "__main__":
    b = B() # 输出为 "B"

判断读到了最后一行,并且退出:

dicFile = open('FilePath','r')
while True:
    line = dicFile.readline()
    if not line:
        break
    #Str Process
dicFile.close()

让git记住密码的操作:

#第一个方法:
vim ./.git/config
# 加入下面两行:
[credential]
    helper = store

#第二个方法,执行下面的命令:
git config --global credential.helper store

会在下次账号密码输入之后记住账号密码。

可以显示所有ssh的别名的命令,放到bashrc或者zshrc都可以

alias sshl='cat ~/.ssh/config | grep "Host "'

json里面不可以添加注释,因为会破坏 互操作性 ,但是我们可以通过key-value来进行注释,也就是把注释当成里面的键值对。

卸载 Docker

卸载 Docker CE 包
$ sudo apt-get purge docker-ce
卸载本机所有的镜像、容器、卷以及配置文件。
$ sudo rm -rf /var/lib/docker
(若仍无法删除,可以使用 dpkg -l | grep docker查询docker相关的软件包,再利用 sudo apt remove --purge 进行指定删除)

进入容器的三种指令,主要是shell的不同:

sudo docker exec -it  569f05d5f4fc /bin/sh
sudo docker exec -it  569f05d5f4fc bash
sudo docker exec -it  569f05d5f4fc /bin/bash 

查看安装的所有软件【带简介】

dpkg -l

查看软件安装的路径

dpkg -L | grep terminator

使用apt查看已安装版本

apt list --installed



isalpha,isalnum的特点
1、将英文字母和汉字都认为是字母。
2、将带圈的也认为是数字。
3、isalnum()是isdigit()和isalpha()的结合。

错误提示:
无法将"*.zip"解压缩到"" (错误 1-操作不被允许)或者 解压缩失败

英文提示:
"Unable to unarchive into file path" (Error 1 - Operation not permitted.) or "Decompression Failed"

解决方法:
用终端unzip 命令进行解压

有人已经建立了多个分词器比较的代码:
https://github.com/ysc/cws_evaluation

git不追踪已经提交到线上的.idea:
git rm -r --cached .idea

python3字典值排序,从大到小

dict1={'a':2,'e':3,'f':8,'d':4}
list1= sorted(dict1.items(),key=lambda x:x[1], reverse=True)
print(list1)  # [('f', 8), ('d', 4), ('e', 3), ('a', 2)]

将docker命令改为普通用户也可以执行:

sudo groupadd docker
sudo gpasswd -a ${USER} docker
sudo systemctl restart docker
sudo chmod a+rw /var/run/docker.sock

python3 从列表里面随机抽取一定数量的元素

import random
list = ['a' , 'b' , 'c' , 'd' , 'e' , 'f' , 'g']
some = random.sample(list , 3)  # 抽取3个
print(some)  

如果有些国内的网站都无法访问,那么有可能是dns的问题,这个时候可以修改/etc/resolv.conf文件,加入阿里和google的dns服务器:

nameserver 223.5.5.5
nameserver 8.8.8.8

将当前文件夹和子文件夹的文件合并到同一个文件:

cat `find $PWD | xargs ls -ld |grep "^-" | awk -F " " '{print $9}'` >> merge.txt

一些软件,代码准则:

YAGNI (You are not gonna need it) 一般认为属于软件工程方法极限编程。YAGNI 原则指出,程序员应该在面临确凿的需求时,才实现相应功能。
SOLID (单一功能 Single responsibility、开闭原则 Open–closed、里氏替换 Liskov substitution、接口隔离 Interface segregation 以及依赖反转Dependency inversion)
DRY do not repeat yourself,不要重复自己,DRY的原则是“系统中的每一部分,都必须有一个单一的、明确的、权威的代表”,指的是(由人编写而非机器生成的)代码和测试所构成的系统,必须能够表达所应表达的内容,但是不能含有任何重复代码。

opencc 遵循的是无线类推原则,会生成一些不在汉字范围内的字,国家推荐针对繁体字的原则是有限类推

繶 𫄷
繸 䍁
繻 𦈡
繿 䍀
纁 𫄸
罃 䓨

如果需要大量判断数据是否在某个列表里面,可以将列表转为set,对set进行in操作,比使用list快100倍:

0.00020503997802734375    set
0.028459787368774414      list

0.001936197280883789      set
2.6600990295410156        list

使用sci-hub的方法:

原地址:https://link.springer.com/article/10.1007/s11709-017-0398-6
添加域名.sci-hub.se:https://link.springer.com.sci-hub.se/article/10.1007/s11709-017-0398-6

python3 将列表分成长度为3的列表

a = [1,2,3,4,5,6,7,8,9]
b = [a[i:i+3] for i in range(0,len(a),3)]

设置seed的用途:当我们设置相同的seed时,每次生成的随机数也相同,如果不设置seed,则每次生成的随机数都会不一样

关于seed()函数用法:
seed( ) 用于指定随机数生成时所用算法开始的整数值。
1.如果使用相同的seed( )值,则每次生成的随即数都相同;
2.如果不设置这个值,则系统根据时间来自己选择这个值,此时每次生成的随机数因时间差异而不同。
3.设置的seed()值仅一次有效

optimizer和lr_scheduler的区别:

optimizer 用于更新模型参数,需要将模型的参数传给optimizer
lr_scheduler 用于更新学习率,针对学习率的更新做一些策略

零宽空格:\u200b,不占宽度,但是是一个字符。

零宽度空格符 (zero-width space) U+200B : 用于较长单词的换行分隔
零宽度非断空格符 (zero width no-break space) U+FEFF : 用于阻止特定位置的换行分隔
零宽度连字符 (zero-width joiner) U+200D : 用于阿拉伯文与印度语系等文字中,使不会发生连字的字符间产生连字效果
零宽度断字符 (zero-width non-joiner) U+200C : 用于阿拉伯文,德文,印度语系等文字中,阻止会发生连字的字符间的连字效果
左至右符 (left-to-right mark) U+200E : 用于在混合文字方向的多种语言文本中(例:混合左至右书写的英语与右至左书写的希伯来语),规定排版文字书写方向为左至右
右至左符 (right-to-left mark) U+200F : 用于在混合文字方向的多种语言文本中,规定排版文字书写方向为右至左

AI术语:Label,Feature,Example

label: 标签,标准答案,即想要得到的结果,比如分类结果中的类别,seq2seq中的tgt
feature:特征,特征向量,
example:样本,(labeled:有标签样本,unlabeled:无标签样本)
model:模型

docker load,save

将一个tar包load成一个image:
docker load < my.tar 或者
docker load -i my.tar

将image save成tar包: 
docker save logmanager:1.0 > logmanager.tar或者
docker save 1312423bf3ee -o /root/dockerfile/my.tar

GDAL 安装

最近想在Ubuntu上使用gdal,通过pip install gdal安装失败。在网上找到了解决办法。

1、安装libgdal-dev
sudo apt-get install libgdal-dev
2、设置环境变量
export CPLUS_INCLUDE_PATH=/usr/include/gdal
export C_INCLUDE_PATH=/usr/include/gdal
3、查看版本号
gdal-config --version
4、安装gdal
pip install GDAL==version (version是步骤3中返回的版本号)

一个可以检查质数的正则表达式/^1?$|^(11+?)\1+$/.

contextmanager https://blog.csdn.net/cpxsxn/article/details/108983545:
总的来说就是提供了一个包裹,包住了执行程序,并且可以在执行前后执行某一个操作。主要是object的 __enter__,__exit__函数

打印文件前10000个字节

cut -c 1-10000 tools/all_dict_keyword_seg_labeled_or_not.jsonl

ab批量请求

ab -n 200 -c 40 -p ./batch.txt -T application/json "http://192.168.11.249:1501/correction"
batch.txt : {"sentences":["因近两年来,受新冠疫情的影响,使得各个行业受到极大的影响、受到限制,很多人面临失业,对于旅游业、线下实体店销售行业以及中小企业更是受到很大的刺激,他们大多选择歇业或者裁员,而这直接影响到很多工薪家庭都主要收入,于是家庭理财成为了大部分人的选择,考虑到家庭理财的实际需求持续提高,树立一个靠得住的理财系统成为当下许多家庭当务之急的任务。"]}

一些检查python代码的方法

py-spy 查看代码耗时花在哪个函数
pip install py-spy
sudo env "PATH=$PATH" py-spy top --pid 32118
pyinstrument 查看函数所有耗时,可以打印调用耗时
from pyinstrument import Profiler
profiler = Profiler()
profiler.start()

some_func()

profiler.stop()
profiler.print()
OSError: [Errno 24] Too many open files
libgcc_s.so.1 must be installed for pthread_cancel to work

ulimit -n 10240

python pool apply_async 使用示例

import multiprocessing as mp
import time


def foo_pool(x):
    time.sleep(2)
    return {'2': x * x}


result_list = []


def log_result(result):
    # This is called whenever foo_pool(i) returns a result.
    # result_list is modified only by the main process, not the pool workers.
    result_list.append(result)


def apply_async_with_callback():
    pool = mp.Pool()
    for i in range(10):
        pool.apply_async(foo_pool, args=(i,), callback=log_result)
    pool.close()
    pool.join()
    print(result_list)


if __name__ == '__main__':
    apply_async_with_callback()

map; map_async; apply; apply_async 四者区别

apply 并没有实现多进程
map 传入一个可迭代的对象,eg. [1,2,3]
map_async 传入一个iterable 对象 eg. range([1,2,3])
apply_async 正常

grep 示例:head -n 100000 cleaned_outline_tp3_tp18.jsonl | grep "\"content\": \"\."

查看pip包安装位置,乃至于可以执行文件的位置pip show py-spy -f

export http_proxy=http://192.168.11.5:30541 https_proxy=http://192.168.11.5:30541

分类的report
from sklearn.metrics import classification_report

修改mongo数据
db.getCollection("collect_record").updateMany( {collectState : NumberInt("4"),taskName:"公式6" }, { $set: { collectState: NumberInt("1") } } )

使用moviepy的时候,一定要确保视频的分辨率是偶数,是奇数的话,大部分播放器都无法播放,并且会花屏。以下是示例代码:

from moviepy.editor import ImageClip, ColorClip, AudioFileClip, TextClip, concatenate_videoclips, CompositeVideoClip
import textwrap


def resize_to_fixed_video_size(clip, video_size=(1920, 1080)):
    """Resize the video clip to a fixed size while keeping its aspect ratio."""
    width, height = clip.size
    video_width, video_height = video_size

    # Calculate the scaling factors for width and height
    width_scale = video_width / width
    height_scale = video_height / height

    # Choose the smaller scale to keep the aspect ratio
    scale = min(width_scale, height_scale)

    # Convert ImageClip to VideoClip and then resize
    resized_clip = clip.to_ImageClip().resize(height=int(height * scale))

    # Create a color clip with the fixed video size
    color_clip = ColorClip(size=video_size, color=(0, 0, 0)).set_duration(clip.duration)

    # Overlay the resized clip on the color clip
    return CompositeVideoClip([color_clip, resized_clip.set_position("center")])


def convert_with_moviepy():
    texts = [
        'BERT使用的是双向Transformer结构,OpenAI GPT使用的是单向左到右的Transformer结构,ELMo使用的是左到右和右到左两个LSTM的拼接。只有BERT的表示同时兼顾了左右两个方向的上下文信息。',
        'BERT的输入包含三部分,分别是词元嵌入、句子嵌入和位置嵌入的总和。这样的设计让BERT可以处理单句和句对的任务。',
        'BERT可以很容易地适配到下游任务中,只需要在预训练模型后面加一个适合任务的输出层。图a和b是两个句子级的分类任务,图c和d是两个词级的序列标注任务。',
        '预训练步数越多,fine-tuning的效果也越好。尽管MLM的收敛速度比LTR略慢,但MLM从一开始就优于LTR,这说明了BERT的双向机制很有效。'
    ]  # 这里是你的文本列表
    font_path = "PingFang-Light.ttf"

    images = ['figure2_1.png', 'figure3_1.png', 'figure6_1.png', 'figure11_1.png']  # 这里是你的图片列表
    audios = ['output_0.wav', 'output_1.wav', 'output_2.wav', 'output_3.wav']  # 这里是你的音频列表

    clips = []
    for text, image, audio in zip(texts, images, audios):
        image = "/tests/resources/pdfimage2/" + image
        audio = "/tests/resources/audio/" + audio
        img_clip = ImageClip(image)
        img_clip = resize_to_fixed_video_size(img_clip)

        img_clip = img_clip.set_duration(AudioFileClip(audio).duration)  # 将图片转换为视频剪辑,并设置持续时间为音频的持续时间
        img_clip = img_clip.set_audio(AudioFileClip(audio))  # 将音频添加到视频剪辑中

        # 将文本分割为若干行,每行不超过40个字符
        lines = textwrap.wrap(text, width=40)
        txt_clips = [TextClip(line, fontsize=24, font=font_path, color='white').set_duration(AudioFileClip(audio).duration / len(lines))
                     for line in lines]  # 创建文本剪辑,并设置持续时间为音频的持续时间除以行数

        # 将所有的文本剪辑组合在一起
        txt_clip = concatenate_videoclips(txt_clips)

        final_clip = CompositeVideoClip([img_clip, txt_clip.set_position('bottom')])  # 将文本剪辑和图片剪辑组合在一起
        final_clip.fps = 24
        clips.append(final_clip)

    final_video = concatenate_videoclips(clips)  # 将所有的剪辑组合成一个完整的视频
    final_video.write_videofile("final.mp4", threads=16)  # 将视频保存为文件

Hadoop、HDFS、Hive、Hbase之间的关系

Hadoop:是一个分布式计算的开源框架

HDFS:是Hadoop的三大核心组件之一

Hive:用户处理存储在HDFS中的数据,hive的意义就是把好写的hive的sql转换为复杂难写的map-reduce程序。

Hbase:是一款基于HDFS的数据库,是一种NoSQL数据库,主要适用于海量明细数据(十亿、百亿)的随机实时查询,如日志明细、交易清单、轨迹行为等。

Hive与HBase的区别与联系
区别:
Hive:Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能。

Hive本身不存储和计算数据,它完全依赖于HDFS和MapReduce,Hive中的表纯逻辑。hive需要用到hdfs存储文件,需要用到MapReduce计算框架。
hive可以认为是map-reduce的一个包装。hive的意义就是把好写的hive的sql转换为复杂难写的map-reduce程序。
HBase:HBase是Hadoop的数据库,一个分布式、可扩展、大数据的存储。

hbase是物理表,不是逻辑表,提供一个超大的内存hash表,搜索引擎通过它来存储索引,方便查询操作
hbase可以认为是hdfs的一个包装。他的本质是数据存储,是个NoSql数据库;hbase部署于hdfs之上,并且克服了hdfs在随机读写方面的缺点。
联系:
Hbase和Hive在大数据架构中处在不同位置,Hbase主要解决实时数据查询问题,Hive主要解决数据处理和计算问题,一般是配合使用。

在大数据架构中,Hive和HBase是协作关系,数据流一般如下图:

通过ETL工具将数据源抽取到HDFS存储;
通过Hive清洗、处理和计算原始数据;
HIve清洗处理后的结果,如果是面向海量数据随机查询场景的可存入Hbase
数据应用从HBase查询数据;

psycopg2默认客户端游标,开启服务端游标的方法是cursor(name='server_cursor')

import psycopg2
import re
from tqdm import tqdm
from psycopg2.extras import DictCursor

def create_connection():
    return psycopg2.connect(
        user='liutao',
        password='liutao123456',
        host='192.168.7.11',
        port='30123',
        database='metaonline',
        cursor_factory=DictCursor
    )


def trans_pg_id_to_redis():
    writer = open("docid.txt", 'w')
    try:
        conn = create_connection()
        with conn.cursor(name='server_cursor') as cursor:
            conn.autocommit = False
            cursor.itersize = 10000
            cursor.execute("SELECT docid FROM meta;")
            total_count = 0
            doc_count = 0
            for docid in tqdm(cursor):
                total_count += 1
                docid = docid[0]
                if docid and re.match(r'\d{16}', docid):
                    doc_count += 1
                    writer.write(str(docid)+"\n")

                if total_count % 100000 == 0:
                    print(f"已经遍历的总id数量=======> {total_count}")
                    print(f"已经遍历的docid数量=======> {doc_count}")
    except Exception as e:
        print("An error occurred:", e)
    finally:
        if conn:
            conn.close()


if __name__ == '__main__':
    # trans_pg_id_to_redis()
    pass

容器代理

编辑~/.docker/config.json 这个文件,如果设置的是--network host,那么可以这么写:

{
 "proxies":
 {
   "default":
   {
     "httpProxy": "http://127.0.0.01:20172",
     "httpsProxy": "http://127.0.0.1:20172",
     "noProxy": "localhost,127.0.0.1,.example.com"
   }
 }
}

然后将docker重启,如果不是,则需要写具体的ip。
这个时候,启动的容器都在启动的时候加入http_proxy=http://127.0.0.1:20172, 并且重启之后也还存在,如果要移除,要首先移除上面的.config.json当中的代理,再重新起一个容器。

seluser@ed80d2afc5e2:/$ echo $http_proxy
http://127.0.0.01:20172

https://note.qidong.name/2020/05/docker-proxy/

查看进程监听了哪些端口

sudo lsof -nP -p 1829 | grep LISTEN

Subscribe to TaaLoo's Blog

Don’t miss out on the latest issues. Sign up now to get access to the library of members-only issues.
jamie@example.com
Subscribe