机器学习的套路
熊熊熊

其他 (机器学习)

1. 前言 这里说说机器学习问题分析的一般性过程,尽管存在各种各样的机器学习问题,但大体上的步骤及最佳实践都有一定的套路。 2. 理解问题 首先得理解要解决的是什么问题,比如:1)业务上要解决什么问题2)该问题涉及到的信息管道有哪些3)如何采集数据,数据源在哪4)数据是完整的吗,数据刻度最小是多少5)数据是定期发布的还是实时获取的6)确定...

1. 前言

这里说说机器学习问题分析的一般性过程,尽管存在各种各样的机器学习问题,但大体上的步骤及最佳实践都有一定的套路。

2. 理解问题

首先得理解要解决的是什么问题,比如:
1)业务上要解决什么问题
2)该问题涉及到的信息管道有哪些
3)如何采集数据,数据源在哪
4)数据是完整的吗,数据刻度最小是多少
5)数据是定期发布的还是实时获取的
6)确定影响模型的有价值因素
7)工作量

3. ETL处理

待收集的数据可能是表格数据、一串实时数据,N维矩阵或其他类型数据,同时也可能是多种存储介质,通过ETL处理将混合的数据源转成我们需要的格式,生成结构化数据类型。

4. 数据预处理

对于收集的数据,可能存在缺陷,比如空值、异常值或数据产生器本身引起的偏差。这些缺陷可能导致模型效果不佳,同时为了优化更快收敛,需要做数据标准化处理,所以需要进行数据预处理。

1)比如缺失值可以简单设为0、列平均值、中值、最高频率值、甚至是稳健算法和knn等等。

2) 比如标准化数据集,使数据集正态分布,平均值为0标准差为1。而且还达到了特征缩放效果。

5. 模型定义

机器学习主要就是模型问题,我们通过机器学习来对现实进行抽象建模,以解决现实问题。所以机器学习主要工作就是使用哪种模型来建模,尽管各种大大小小模型一大堆,但大体上也有些套路。
1)要完成的任务是预测结果还是对数据进行分类,前者是回归问题,后者是分类问题。
2)对于分类问题,如果需要数据标记,则是监督学习,否则是非监督学习,使用聚类技术。
3)数据是否为连续的,是的话考虑序列模型,比如自回归和RNN之类的。
4)尽量使用简单模型,如果能用比如用单变量或多变量的线性回归或逻辑回归。
5)简单模型解决不了的情况,可通过多层神经网络解决,比如复杂的非线性。
6)使用了多少个维度的变量,将作用大的特征提取出来,并把不重要的特征去掉,比如用PCA降维。
7)不是监督也不是非监督?考虑强化学习?

6. 损失函数

损失函数用于衡量模型质量,它可以度量模型预测值与实际期望之间的差距,选择不合适的函数可能会影响模型的准确性,甚至影响收敛速度。

7. 模型训练

数据准备好了,模型定义好了,就可以开始训练模型。训练中涉及几个关键术语:迭代,表示模型计算和调整的一次过程;批,数据集每次以一批为单位输入到模型中;epoch,每当整个数据集被处理完称为一个epoch。
另外,训练模型前先调整模型的初始权重,以便能更快更好地收敛。不能初始化为0,否则将导致学习失败。一般可以使用标准化技术将权重初始化。

8. 数据集分割

一般将整个数据集分成三组,比例是7:2:1,第一组为训练集,用于调整模型参数;第二种为验证集,用于比较多个模型直接的表现;第三组为测试集,用于测试训练得到的模型准确性。

9. 模型效果

模型训练完后要看效果如何,要看看泛化的能力。
(1)对于回归问题,可以通过下面几个指标来了解拟合效果。
平均绝对误差
中值绝对误差
均方误差等等

(2)对于分类问题,可以通过下面几个指标来了解分类效果。
准确性
精确率
召回率
F值
混淆矩阵

(3)对于聚类问题,可以通过下面几个指标来了解聚类效果。
轮廓系数
同质性
完整性
V度量

581人浏览 0条评论 2 收起
2019-05-10 15:21:39
条评论
numactl 使用说明
minus one

其他 (系统编程)

Name numactl - Control NUMA policy for processes or shared memory numactl -用于控制进程与共享存储的NUMA技术机制NUMA -- (Non Uniform Memory Access Architecture)非统一内存访问架构Synopsis 概述numactl...

Name
numactl - Control NUMA policy for processes or shared memory
numactl -用于控制进程与共享存储的NUMA技术机制
NUMA -- (Non Uniform Memory Access Architecture)非统一内存访问架构
Synopsis
概述
numactl [--interleave nodes] [- -preferred node] [--membind nodes]
[--cpunodebind nodes] [--physcpubind cpus] [--localalloc] [--] {arguments ...}
numactl --show
numactl --hardware
numactl [--huge ] [--offset offset] [--shmmode shmmode] [--length length] [--strict]
[--shmid id] --shm shmkeyfile | --file tmpfsfile
[--touch] [--dump] [ --dump-nodes] memory policy
Description
使用方法介绍
numactl runs processes with a specific NUMA scheduling or memory placement policy.
使用numactl命令启动的进程会按照特定的NUMA调度机制或是在指定的内存空间位置上运行.
The policy is set for command and inherited by all of its children .
让进程按照NUMA调度机制运行是通过命令行来实现的,而被设定进程得子进程也会遵照NUMA调度机制运行.
In addition it can set persistent policy for shared memory segments or files.
除了将NUMA调度机制设置在进程上之外,还可通过将该NUMA调度机制作用在共享内存段或是文件对象上来实现NUMA策略的持久化.
/也就是把可持久化的对象(内存空间或是文件实体)设定成符合NUMA调度机制的实体,这样运行在该块空间上的所有数据的调度都可以按照NUMA策略来执行
Use
-- before command if using command options that could be confused with numactl options.
numactl命令的使用方法
--在使用该命令之前,如果不了解每个命令选项的确切含义的话,只会是使用命令使 者徒增麻烦
Policy settings are :
关于numactl命令的不同选项解释如下
--interleave=nodes, -i nodes
Set a memory interleave policy. Memory will be allocated using round robin on nodes.
这个选项用于设定内存的交织分配模式。也就是说系统在为多个节点分配内存空间的时候,将会以轮询分发的方式被分配给这多个节点.
When memory cannot be allocated on the current interleave target fall back to other nodes.
如果在当前众多的交织分配内存节点中的目标节点无法正确的分配内存空间的话,内存空间将会由其他的节点来分配。
Multiple nodes may specified on --interleave, --membind and --cpunodebind.
多节点可以通过--interleave , --membind和--cpunodebind命令来指定.
You may specify "all" , which means all nodes in the current cpuset. nodes may be specified as N,N,N or NN or N, NN or NN , NN and so forth.
也可以通过使用'all'这个选项, 'all'选项是用来选定在当前运行的cpu集合中的所有节点.节点可以通过N,N,N或是NN或是N,NN或者是NN , NN诸如此类的
方式来指定
/其中N,N,N --> node1,node2,node0可以看做是将numa调度机制施加到node1, node2, node3的上面
/而NN or N ---> node1-node7, node12可以看做是将numa机制施加到[node1,node7]和单独的node12节点上面,
/后面的NN等等都是在此基础上演变而来的
Relative nodes may be specified as +N,N,N or +NN or + N,NN and so forth.
如果节点之间具有相关性的话,是可以通过+N,N,N或者是+NN或者是+N,NN这种设定方式来表明这些节点之间是有相关性的.
The +indicates that the node numbers are relative to the process' set of allowed cpu in its current cpuset .
上面命令中使用'+'符号作为修饰的节点与被准许留在在当前cpu集合中的cpu上所运行的进程是一一对应的.
A !NN notation indicates the inverse of NN , in other words all nodes except NN.
!NN这种表述方式表明的是NN含义的翻转,也就是说,某个命令将会被施加在除了NN这一区间内的节点以外的所有节 集上面
If used with + notation , specify !+NN .
如果在使用'!'符号的同时,也需要使用'+'符号的话,按照'!+NN'这个顺序来使用。
--membind=nodes, -m nodes
Only allocate memory from nodes. Allocation will fail when there is not enough memory available on these nodes.
选项'--membind'仅用来从节点中分配内存空间所用。如果在这些节点中无法分配出所请求的空间大小的话该分配操作将会失败.
nodes may be specified as noted above .
上述命令中指定需要分配空间的nodes的方式可以遵照上述N,N,N , NN , N这种方式来指定.
--cpunodebind=nodes, -N nodes
Only execute process on cpus. This accepts cpu numbers as shown in the processor fields of /proc/cpuinfo , or relative cpus as in relative to the current cpuset.
上述命令仅用于施加在运行与cpu上的进程。这个命令用于显示cpu的个数,cpu数目信息同样记录在系统中的存放处理器领域信息的/proc/cpuinfo文件夹下,
或者是按照关联的中央处理器信息在当前的中央处理器集中所存放.
You may specify "all" , which means all cpus in the current cpuset .
使用者可以通过制定"all"这个选项来选定当前中央处理器集合中的所有中央处理器对象.
Physical cpus may be specified as N,N ,N or NN or N, NN or NN,NN and so forth .
物理(而非程序中所抽象的) cpu实体也可以按照N,N,N或是NN或者是N,NN或是NN,NN诸多选定方式进行选定.
Relative cpus may be specified as +N,N,N or +NN or +N,NN and so forth.
相互关联的cpu实体也可以按照+N,N,N或是+NN ,或+ N,NN来选定并表明他们之间的关系.
The +indicates that the cpu numbers are relative to the process' set of allowed cpu in its current cpuset.
上述命令中的'+'符号用于表明中央处理器的标号与当前其所在的中央处理器集合中某个cpu上运行的进程集合中的进程之间是有一定的关联的。
A !NN notation indicates that the cpu inverse of NN , in other words all cpus except NN if used with + notation , specify !+NN .
!NN这种表述方式表明的是NN含义的翻转,也就是说,某个命令将会被施加在除了NN这一区间内的节点以外的所有节点集上
--localalloc , -l
Always allocate on the current node.
这个命令选项通常是为当前的节点分配内存的
--preferred=node
Preferably allocate memory on node, but if memory cannot be allocated there fallback to other nodes.
该命令由于指定优先分配内存空间的节点,如果无法将空间分配给该节点的话,应该分配给该节点上的空间将会被分发到其他的节点上
This option takes only a single node number . Relative notation may be used.
该命令选项后面仅接收一个单独的节点标号.相关的表示方式也可以使用.
--show,-s
Show NUMA policy setting of the current process.
该命令用于显示NUMA机制作用在当前运行的那些进程上
--hardware , -H
Show inventory of available nodes on the system.
该命令用于显示当前系统中有多少个可用的节点.
Numactl can set up policy for a SYSV shared memory segmemnt or a file in shmfs/hugetlbfs.
numactl命令也可以作用在系统级的共享内存段上或者是施加在shmfs/hugetlbfs的文件上
This policy is persistent and will be used by all mappings from that shared memory .
numa的这种机制是可以被持久化的,并且将被施加numa机制的共享内存映射到自己地址空间中的进程都具有numa机制
The order of options matters here.
调用命令时所使用的参数选项按照下面的顺序来使用
The specification must at least include either of --shm , --shmid , --file to specify the shared memory segment or file
and a memory policy like described above ( --interleave , --localalloc , --preferred , --membind) .
在使用命令的时候必须至少包括--shm ,--shmid , --file来表明numa机制作用在共享内存段上还是文件上面,
并且还要指定上面介绍过的操作内存的方式(通过这些选项来指定--interleave, --localalloc, --preferred , --membind )

--huge
When creating a SYSV shared memory segment use huge pages . Only valid before --shmid or --shm
当创建一个基于大内存页面的系统级的共享内存段的时候,使用--huge这个选项。
--huge选项仅在--shmid或是--shm命令的后面使用才有效.
--offset
Specify offset into the shared memory segment. Default 0. Valid uints are m (for MB), g (for GB) , k (for KB) , otherwise it specifies bytes.
该参数选项用于指定共享内存段中的位移量的偏移。默认的情况下偏移量是0 。有效的偏移量单位是m (用于表示MB)
g (用于表示GB) , k (用于表示KB ),其他没有指定的被认为是以字节为单位.
--strict
Given an error when a page in the policied area in the shared memory segment already was faulted in with a conflicting policy .
Default is to silently ignore this .
这个参数选项当施加了NUMA调度机制的共享内存段区域的页面被施加了另一个机制而导致错误的时候,
使用--strict选项将会把错误信息显示出来.默认情况是不使用该选项的。
--shmmode shmmode
Only valid before --shmid or --shm When creating a shared memory segment set it to numeric mode shmmode .
该选项仅在--shmid或是--shm之前使用才会生效。当创建一个共享内存段的时候,通过整型数值来指定
共享内存的共享的模式类型.
--length length
Apply policy to length range in the shared memory segment or make the segment length long Default is to use the remaining
length Required when a shared memory segment is created and specifies the length of the new segment then .
Valid units are m ( for MB ) , g( for GB) , k ( for KB) , otherwise it specifies bytes.
--shmid id
Create or use an shared memory segment with numeric ID id .
通过ID号码来创建或使用一个共享内存段。
(如果共享内存段已经存在,那么通过shmid来指定下面要使用某个ID的共享内存段;如果该ID对应的共享内存段并不存在的话,那么就创建一个)
--shm shmkeyfile
Create or use an shared memory segment , with the ID generate using fork(3) from shmkeyfile
通过存放在shmkeyfile(共享内存-键文件)中的ID号码来创建或者是使用一个共享内存段。
访问shmkeyfile文件的进程是通过fork(3 arguments)方法来实现的.
--file tmpfsfile
Set policy for a file in tmpfs or hugetlbfs
将numa机制施加于文件上面,这个文件属于tmpfs或者是hugetlbfs这种特殊的文件系统
--touch
Touch pages to enforce policy early. Default is to not touch them , the policy is applied when a applications maps and accesses a page.
通过将numa机制施加于刚刚页面上来实现内存的早期numa化。
默认情况下是不使用该选项,如果存在映射或是访问页面的应用的话,将会使用该早期实行NUMA机制的这种方法.
--dump
Dump policy in the specified range .
该选项用于废除将已经numa化的特定区域上的NUMA性质.
Valid node specifiers
all All nodes
number Node number
number1{,number2} Node number1 and Node number2
number1-number2 Nodes from number1 to number2
!nodes Invert selection of the following specification .
(--dump )选项后,有效指定node的书写方式
all用于将所有的节点上的NUMA特性移除
number通过指定node后接的数值来废除该数字对应的node
number1(number2) node number1(node number2)上的NUMA特性将会被移除
number1-number2 node number1 -- node number2区间上的所有存在的node的NUMA特性将会被移除
!nodes除了nodes所指定的节点以外的所有节点上的NUMA特性全都会被移除
Examples
使用示例
numactl --physcpubind=+0-4,8-12 myapplic arguments
Run myapplic on cpus 0-4 and 8-12 of the current cpuset .
上述的这个命令用于将myapplic程序进程运行在当前中央处理器集合的0 -4和8-12标号的cpu上面.
numactl --interleave=all bigdatabase arguments
Run big database with its memory interleaved on all CPUs.
将大型数据库系统进程,并且允许该进程使用所有cpu交替分配的内存空间.( round robin内存分配机制)
numactl --cpubind=0 --membind=0,1 process
Run process on node 0 with memory allocated on node0 and 1 .
上述的命令是将进程运行在node0上面,而进程运行所需要的内存空间则是从node0和node1上面分配而来的
numactl --cpubind=0 --membind=0,1 --process -l
Run process as above, but with an option (-l) that would be confused with a numactl option .
运行上述的程序,但是这个命令中有一个-l的选项可能会和numactl的设置选项弄混淆
numactl --preferred=1 numactl --show
Set preferred node 1 and show the resulting state.
将node1这个节点设置为优先运行进程的节点,设置之后调用--show参数来显示当前进程运行的状态信息
numactl -- interleave=all --shmkeyfile /tmp/shmkey
interleave all of the sysv shared memory region specified by /tmp/shmkey over all nodes.
交织/交替将系统中所有在/tmp/shmkey文件夹下创建的系统级的共享内存域(因为内存区间段可能有多个,并且有可能出现不连续的,这个命令是将其全部选上)
分配给系统中的所有节点
numactl --offset=1G --length=1G --membind= 1 --file /dev/shm/A --touch
Bind the second gigabyte in the tmpfs file /dev/shm/A to node1.
在tmpfs文件系统中文件夹/dev/shm/下面创建1 GB大小的文件,并将该文件命名为A ,然后将该1GB的文件与node 1进行绑定.
/也就是说node1中使用的内存是来自于文件系统中的文件.
numactl --localalloc /dev/shm/file
Reset the policy for the shared memory file to the default localalloc policy.
将共享文件的NUMA特性重置成本地默认调度机制
Notes
注意
Requires an NUMA policy aware kernel .
执行numactl命令之前,需要明确知道当前主机的内核是支持NUMA技术的.
Command is not executed using s shell. If you want to use shell metacharacters in the child use sh -c as wrapper.
上述命令在shell脚本中无法被执行。如果想要在子脚本中使用shell元字符的话需要在前面加上用作封装器的-c选项
Setting policy for hugetlbfs file does currently not work because it cannot be extended by truncate.
将NUMA机制施加于hugetblfs文件系统中的文件上的时是不会立即生效的,因为hugetblfs这个文件系统无法以truncate的方式打开文件.
/在普通文件系统中,truncate打开文件的方式是这样的:当文件不在指定路径下存在的时候,会在该路径下创建该文件,然后将其打开;
/当文件存在的时候,会自己打开该文件
Shared memory segments larger than numactl's address space cannot be completely policied.
如果共享内存段的大小要大于执行numactl这一命令进程的地址空间要打的话,不能够确保全部共享内存区域都具有NUMA机制.
This could be a problem on 32bit architectures.
在32位架构主机上就有可能出现这个问题(共享内存段无法完全的实现NUMA机制).
Changing it piece by piece may work .
把(范围区间十分大的)共享内存段分割成多个小段,然后一段一段的NUMA化可能会解决这个问题.
The old --cpubind which accepts node numbers, not cpu numbers, is deprecated and replaced with the new --cpunodebind and --physcpubind optins.
以前的旧命令选项--cpubind接收的数字表示的是node的个数而非cpu的个数,这个命令已经过时了,取而代之的是--cpunodebind和--physcpubind
(分别用于设定绑定的cpu中节点的个数,和绑定的物理cpu的个数)
Files
关于系统文件
/ proc/cpuinfo for the listing of active CPUs.
位于/proc/cpuinfo路径下的文件记录的是当前活跃状态的CPU的信息
/sys/devices/system/node/node*/numastat for NUMA memory hit statistics.
/sys/devices/system/node/node*/ numastat文件用于记录的是使用NUMA调度策略之后,内存命中率等相关统计信息

1520人浏览 0条评论 0 收起
2019-06-27 20:10:56
条评论
linux ulimit命令
minus one

高级编程

ulimit命令描述ulimit用于shell启动进程所占用的资源. 想象一个状况:我们的Linux主机里面同时登陆了十个人,这十个人同时打开了100个文件,每个文件的大小为10MB,请问一下我们的Linux主机内存要有多大才够?10*100*10=10000MB=10GB,这样,系统不挂掉才怪,为了预防这种情况的发生,所以我们的bash...

ulimit命令描述

ulimit用于shell启动进程所占用的资源. 

想象一个状况:我们的Linux主机里面同时登陆了十个人,这十个人同时打开了100个文件,每个文件的大小为10MB,请问一下我们的Linux主机内存要有多大才够?10*100*10=10000MB=10GB,这样,系统不挂掉才怪,为了预防这种情况的发生,所以我们的bash是可以限制用的某些系统资源的,包括可以打开的文件数量、可以使用的CPU时间、可以使用的内存总容量。如何设置?用ulimit吧!

ulimit用于限制shell启动进程所占用的资源,支持以下各种类型的限制:所创建的内核文件的大小、进程数据块的大小、Shell进程创建文件的大小、内存锁住的大小、常驻内存集的大小、打开文件描述符的数量、分配堆栈的最大大小、CPU时间、单个用户的最大线程数、Shell进程所能使用的最大虚拟内存。同时,它支持硬资源和软资源的限制。

作为临时限制,ulimit可以作用于通过使用其命令登录的shell会话,在会话终止时便结束限制,并不影响于其他shell会话。而对于长期的固定限制,ulimit命令语句又可以被添加到由登录shell读取的文件中,作用于特定的shell用户。

用户进程的有效范围

ulimit作为对资源使用限制的一种工作,是有其作用范围的。那么,它限制的对象是单个用户,单个进程,还是整个系统呢?事实上,ulimit限制的是当前shell进程以及其派生的子进程。举例来说,如果用户同时运行了两个shell终端进程,只在其中一个环境中执行了ulimit – s 100,则该shell进程里创建文件的大小收到相应的限制,而同时另一个shell终端包括其上运行的子程序都不会受其影响:

命令格式

ulimit [options] [limit] 

参数

-H:hard limit,严格的设置,必定不能超过这个设置的数值

-S:sof limit,警告的设置,可以超过这个设置值,但是若超过则有警告信息。在设置上,通常soft会比hard小,举例来说,soft可设置为80而hard设置为100,那么可以使用到90(因为没有超过100),但介于80~100之间时,系统会有警告信息通知您

-a:后面不接任何参数,可列出所有的限制额度

-c size:设置core文件的最大值.单位:blocks,当某些进程发生错误时,系统可能会将该进程在内存中的信息写成文件(排错用),这种文件就被称为内核文件(core file)。次为限制每个内核文件的最大容量。

-f size:此shell可以创建的最大文件容量(一般可能设置为2GB)单位为KB 

-d size:设置数据段(segment)的最大值.单位:kbytes;

-l size:设置在内存(lock)中锁定进程的最大值.单位:kbytes;

-t size:设置CPU使用时间的最大上限.单位:seconds 

-n size:设置内核可以同时打开的文件描述符的最大值.单位:n 

-u size:单一用户可以使用的最大进程(process)数量

-s size:设置堆栈的最大值.单位:kbytes 

-v size:设置虚拟内存的最大值.单位:kbytes 

具体的options含义以及简单示例可以参考以下表格。

选项[options]含义例子

-H设置硬资源限制,一旦设置不能增加。ulimit – Hs 64;限制硬资源,线程栈大小为64K。

-S设置软资源限制,设置后可以增加,但是不能超过硬资源设置。ulimit – Sn 32;限制软资源,32个文件描述符。

-a显示当前所有的limit信息。ulimit – a;显示当前所有的limit信息。

-c最大的core文件的大小,以blocks为单位。ulimit – c unlimited;对生成的core文件的大小不进行限制。

-d进程最大的数据段的大小,以Kbytes为单位。ulimit -d unlimited;对进程的数据段大小不进行限制。

-f进程可以创建文件的最大值,以blocks为单位。ulimit – f 2048;限制进程可以创建的最大文件大小为2048 blocks。

-l最大可加锁内存大小,以Kbytes为单位。ulimit – l 32;限制最大可加锁内存大小为32 Kbytes。

-m最大内存大小,以Kbytes为单位。ulimit – m unlimited;对最大内存不进行限制。

-n可以打开最大文件描述符的数量。ulimit – n 128;限制最大可以使用128个文件描述符。

-p管道缓冲区的大小,以Kbytes为单位。ulimit – p 512;限制管道缓冲区的大小为512 Kbytes。

-s线程栈大小,以Kbytes为单位。ulimit – s 512;限制线程栈的大小为512 Kbytes。

-t最大的CPU占用时间,以秒为单位。ulimit – t unlimited;对最大的CPU占用时间不进行限制。

-u用户最大可用的进程数。ulimit – u 64;限制用户最多可以使用64个进程。

-v进程最大可用的虚拟内存,以Kbytes为单位。ulimit – v 200000;限制最大可用的虚拟内存为200000 Kbytes。

1、-a参数,下面是root用户的ulimit默认输出

[root@awake ~]# ulimit -a 

core file size (blocks, -c) 0 //0为关闭即不生产core文件,linux下默认是不产生core文件的,要用ulimit -c unlimited开启,并不限制文件大小,设置运行时产生调试信息。

data seg size (kbytes, -d) unlimited //啥是数据段?总之这里开启了,并且无限制。

scheduling priority (-e) 0 //啥是调度优先级?

file size (blocks, -f) unlimited //可创建的单一文件的大小

pending signals (-i) 7795 //啥是等待信号?

max locked memory (kbytes, -l) 64 //最大可加锁内存大小,以Kbytes为单位,应该是这个用户也就是root的最大独享内存?

max memory size (kbytes, -m) unlimited //最大内存大小,无限制(系统有多少就用多少吗?)

open files (-n) 1024 //同时可打开的文件数量

pipe size (512 bytes, - p) 8 //管道缓存区大小,不知是干什么的

POSIX message queues (bytes, -q) 819200 //POSIX消息队列

real-time priority (-r) 0 //实时优先级,不知

stack size (kbytes , -s) 10240 //线程堆栈大小,10MB 

cpu time (seconds, -t) unlimited //占用cpu的时间,无限制

max user processes (-u) 7795 //用户最大可用的进程数,最多可以使用7795个

virtual memory (kbytes, -v) unlimited //虚拟内存

file locks (-x) unlimited //文件锁,

2、block概念

其实本来这几个概念不是非常难,主要是NND他们的名字都相同,都叫“Block Size”。

a、硬盘上的block size,应该是"sector size",linux的扇区大小是512byte 

b、有文件系统的分区的block size,是"block size",大小不一,能用tune2fs工具查看,单一文件系统能够支持的单一文件大小与block的大小有关,例如block size为1024byte时,单一文件可达16GB,如果block size为4096byte时,单一文件可达2TB。

[root@RHEL6 ~]# tune2fs -l /dev/sda3 | grep "Block size" 

Block size: 4096 

c、没有文件系统的分区的block size,也叫“block size”,大小指的是1024 byte 

e、 Kernel buffer cache的block size,就是"block size",大部分PC是1024 

f、磁盘分区的"cylinder size" ,用fdisk 能查看。

3、开启或关闭core文件的生成

ulimit -c可以查看是否打开此选项,若为0则为关闭;其他参数值也是如此查看

ulimit -c 0可手动关闭

ulimit -c 1000为设置core文件大小最大为1000k 

ulimit -c unlimited设置core文件大小为不限制大小

4、实例限制用户仅能创建10MB以下额容量文件

[root@awake ~]# ulimit -f 10240 //设置用户可以创建的文件最大值block=10240k即为10M 

[root@RHEL6 ~]# ulimit -a | grep "^file size" //查看

file size ( blocks, -f) 10240 

[root@awake ~]# dd if=/dev/zero of=desfile bs=1M count=20 //使用dd在当前目录下创建一个名为desfile大小为20M的文件。

File size limit exceeded 

5、我们可以通过以下几种方式来使用ulimit:

在用户的启动脚本中

如果用户使用的是bash,就可以在用户的目录下的.bashrc文件中,加入ulimit – u 64,来限制用户最多可以使用64个进程。此外,可以在与.bashrc功能相当的启动脚本中加入ulimt。

在应用程序的启动脚本中

如果用户要对某个应用程序myapp进行限制,可以写一个简单的脚本startmyapp。

ulimit – s 512 

myapp 

以后只要通过脚本startmyapp来启动应用程序,就可以限制应用程序myapp的线程栈大小为512K。

直接在控制台输入

user@tc511-ui:~>ulimit – p 256 

限制管道的缓冲区为256K。

6、用户进程的有效范围

ulimit作为对资源使用限制的一种工作,是有其作用范围的。那么,它限制的对象是单个用户,单个进程,还是整个系统呢?事实上,ulimit限制的是当前shell进程以及其派生的子进程。举例来说,如果用户同时运行了两个shell终端进程,只在其中一个环境中执行了ulimit – s 100,则该shell进程里创建文件的大小收到相应的限制,而同时另一个shell终端包括其上运行的子程序都不会受其影响:

Shell进程1 

ulimit – s 100 

cat testFile > newFile 

File size limit exceeded 

Shell进程2 

cat testFile > newFile 

ls – s newFile 

323669 newFile 

那么,是否有针对某个具体用户的资源加以限制的方法呢?答案是有的,方法是通过修改系统的/etc/security/limits (RHEL6.4的文件位置是/etc/security/limit.conf)配置文件。该文件不仅能限制指定用户的资源使用,还能限制指定组的资源使用。该文件的每一行都是对限定的一个描述,格式如下:

domain表示用户或者组的名字,还可以使用*作为通配符。Type可以有两个值,soft和hard。Item则表示需要限定的资源,可以有很多候选值,如stack,cpu,nofile等等,分别表示最大的堆栈大小,占用的cpu时间,以及打开的文件数。通过添加对应的一行描述,则可以产生相应的限制。例如:

* hard noflle 100

该行配置语句限定了任意用户所能创建的最大文件数是100。

现在已经可以对进程和用户分别做资源限制了,看似已经足够了,其实不然。很多应用需要对整个系统的资源使用做一个总的限制,这时候我们需要修改/proc下的配置文件。/proc目录下包含了很多系统当前状态的参数,例如/proc/sys/kernel/pid_max,/proc/sys/net/ipv4/ip_local_port_range等等,从文件的名字大致可以猜出所限制的资源种类。由于该目录下涉及的文件众多,在此不一一介绍。有兴趣的读者可打开其中的相关文件查阅说明。

回页首

7、ulimit管理系统资源的例子

ulimit提供了在shell进程中限制系统资源的功能。本章列举了一些使用ulimit对用户进程进行限制的例子,详述了这些限制行为以及对应的影响,以此来说明ulimit如何对系统资源进行限制,从而达到调节系统性能的功能。

7.1使用ulimit限制shell的内存使用

在这一小节里向读者展示如何使用– d,– m和– v选项来对shell所使用的内存进行限制。

首先我们来看一下不设置ulimit限制时调用ls命令的情况:

未设置ulimit时ls命令使用情况

大家可以看到此时的ls命令运行正常。下面设置ulimit:

>ulimit -d 1000 -m 1000 -v 1000 

这里再温习一下前面章节里介绍过的这三个选项的含义:

-d:设置数据段的最大值。单位:KB。

-m:设置可以使用的常驻内存的最大值。单位:KB。

-v:设置虚拟内存的最大值。单位:KB。

通过上面的ulimit设置我们已经把当前shell所能使用的最大内存限制在1000KB以下。接下来我们看看这时运行ls命令会得到什么样的结果:

haohe@sles10-hehao:~/code/ulimit> ls test -l 

/bin/ls: error while loading shared libraries: libc.so.6: failed to map segment 

from shared object: Cannot allocate memory 

从上面的结果可以看到,此时ls运行失败。根据系统给出的错误信息我们可以看出是由于调用libc库时内存分配失败而导致的ls出错。那么我们来看一下这个libc库文件到底有多大:

查看libc文件大小

从上面的信息可以看出,这个libc库文件的大小是1.5MB。而我们用ulimit所设置的内存使用上限是1000KB,小于1.5MB,这也就充分证明了ulimit所起到的限制shell内存使用的功能。

7.2使用ulimit限制shell创建的文件的大小

接下来向读者展示如何使用-f选项来对shell所能创建的文件大小进行限制。

首先我们来看一下,没有设置ulimit -f时的情况:

查看文件

现有一个文件testFile大小为323669 bytes,现在使用cat命令来创建一个testFile的copy:

未设置ulimit时创建复本

从上面的输出可以看出,我们成功的创建了testFile的拷贝newFile。

下面我们设置ulimt – f 100:

> ulimit -f 100 

-f选项的含义是:用来设置shell可以创建的文件的最大值。单位是blocks。

现在我们再来执行一次相同的拷贝命令看看会是什么结果:

设置ulimit时创建复本

这次创建testFile的拷贝失败了,系统给出的出错信息时文件大小超出了限制。在Linux系统下一个block的默认大小是512 bytes。所以上面的ulimit的含义就是限制shell所能创建的文件最大值为512 x 100 = 51200 bytes,小于323669 bytes,所以创建文件失败,符合我们的期望。这个例子说明了如何使用ulimit来控制shell所能创建的最大文件。

7.3使用ulimit限制程序所能创建的socket数量

考虑一个现实中的实际需求。对于一个C/S模型中的server程序来说,它会为多个client程序请求创建多个socket端口给与响应。如果恰好有大量的client同时向server发出请求,那么此时server就会需要创建大量的socket连接。但在一个系统当中,往往需要限制单个server程序所能使用的最大socket数,以供其他的server程序所使用。那么我们如何来做到这一点呢?答案是我们可以通过ulimit来实现!细心的读者可能会发现,通过前面章节的介绍似乎没有限制socket使用的ulimit选项。是的,ulimit并没有哪个选项直接说是用来限制socket的数量的。但是,我们有-n这个选项,它是用于限制一个进程所能打开的文件描述符的最大值。在Linux下一切资源皆文件,普通文件是文件,磁盘打印机是文件,socket当然也是文件。在Linux下创建一个新的socket连接,实际上就是创建一个新的文件描述符。如下图所示(查看某个进程当前打开的文件描述符信息):

查看进程打开文件描述符

因此,我们可以通过使用ulimit – n来限制程序所能打开的最大文件描述符数量,从而达到限制socket创建的数量。

7.4使用ulimit限制shell多线程程序堆栈的大小(增加可用线程数量)

在最后一个例子中,向大家介绍如何使用-s(单位KB)来对线程的堆栈大小进行限制,从而减少整个多线程程序的内存使用,增加可用线程的数量。这个例子取自于一个真实的案例。我们所遇到的问题是系统对我们的多线程程序有如下的限制:

ulimit -v 200000

根据本文前面的介绍,这意味着我们的程序最多只能使用不到200MB的虚拟内存。由于我们的程序是一个多线程程序,程序在运行时会根据需要创建新的线程,这势必会增加总的内存需求量。一开始我们对堆栈大小的限制是1024 (本例子中使用1232来说明):

# ulimit – s 1232 

当我们的程序启动后,通过pmap来查看其内存使用情况,可以看到多个占用1232KB的数据段,这些就是程序所创建的线程所使用的堆栈:

程序线程所使用的堆栈

每当一个新的线程被创建时都需要新分配一段大小为1232KB的内存空间,而我们总的虚拟内存限制是200MB ,所以如果我们需要创建更多的线程,那么一个可以改进的方法就是减少每个线程的固定堆栈大小,这可以通过ulimit – s来实现:

# ulimit -s 512 

我们将堆栈大小设置为512KB,这时再通过pmap查看一下我们的设置是否起作用:

设置ulimit后堆栈大小

从上面的信息可以看出,我们已经成功的将线程的堆栈大小改为512KB了,这样在总内存使用限制不变的情况下,我们可以通过本小节介绍的方法来增加可以创建的线程数,从而 达到改善程序的多线程性能。

想要复原ulimit的设置最简单的方法就是注销再登录,否则就是要重新以ulimit设置才行,不过要注意的是一般身份用户如果以ulimit设置了-f的文件大小,那么他只能继续减小文件容量,不能增加文件容量。  

1203人浏览 0条评论 0 收起
2019-06-27 20:15:34
条评论
Django如何解决跨域及被iframe标签引用
everglow

Django

Django默认是不支持跨域操作的,如果其他Web页面中需要使用到iframe标签将Django项目引用,是需要Django项目自身支持跨域操作,才能够正常使用的。我们可以在命令行中红通过pip install django-cors-headers来安装django-cors-headers库来解决跨域支持的问题。django-cors...

Django默认是不支持跨域操作的,如果其他Web页面中需要使用到iframe标签将Django项目引用,是需要Django项目自身支持跨域操作,才能够正常使用的。
我们可以在命令行中红通过pip install django-cors-headers来安装django-cors-headers库来解决跨域支持的问题。
django-cors-headers安装完成后,需要对Django项目的settings.py文件添加一些配置。

settings.py相关配置

INSTALLED_APPS

    INSTALLED_APPS = [
        ...
        "corsheaders",
    ]

MIDDLEWARE(Django1.10之前的版本使用MIDDLEWARE_CLASSES)

MIDDLEWARE = [
    ...
    "corsheaders.middleware.CorsMiddleware",
    "django.middleware.commonm.CommonMiddleware",
    ...
]

CorsMiddleware应尽可能放置再可以生成相应的任何中间件之前,例如Django的CommonMiddleware。如果不是在之前,将无法将CORS表头添加到这些响应中。

CORS_ORIGIN_ALLOW_ALL

默认为Fasle。设置为True时,将不使用白名单,并将接受所有的来源。

CORS_ORIGIN_WHITELIST

默认为[]。授权进行跨站点HTTP请求的来源列表。
示例:

CORS_ORIGIN_WHITELIST = [
    "http://www.example.com",
    "http://localhost:8000",
    "http://127.0.0.1:8080",
]

CORS_ORIGIN_REGEX_WHITELIST

默认为[]。表示与授权进行跨站点HTTP强求的Origins匹配的正则表达式的字符串列表。
示例:

CORS_ORIGIN_REGEX_WHITELIST = [
    r"^https://\w+\.example\.com$",
]

CORS_URLS_REGEX

默认为r'^.*$',即匹配所有的URL。一个正则表达式,用来限制将为其发送CORS标头的URL。

CORS_ALL_METHODS

实际允许的HTTP请求方式列表,默认为

CORS_ALLOW_METHODS  = [
     'DELETE',
     'GET',
     'OPTIONS',
     'PATCH',
     'POST',
     'PUT',
]

可以通过from corsheaders.defaultsdefault_methods import default_methods导入默认值,并进行扩展。

from corsheaders.defaults import default_methods

CORS_ALLOW_METHODS = list(default_methods) + [
    'POKE',
]

CORS_ALLOW_HEARDER

发出实际请求时可以使用的非标准的HTTP标头列表,默认为

CORS_ALLOW_HEADERS = [
    'accept',
    'accept-encoding',
    'authorization',
    'content-type',
    'dnt',
    'origin',
    'user-agent',
    'x-csrftoken',
    'x-requested-with',
]

可以通过from corsheaders.defaultsdefault_methods import default_headers导入默认值,并进行扩展。

from corsheaders.defaults import default_headers

CORS_ALLOW_HEADERS  = list(default_headers ) + [
    'my-custom-header',
]

CORS_EXPOSE_HEADERS

默认为[]。要向浏览器公开的HTTP标头列表。

CORS_PREFLIGHT_MAX_AGE

默认为86400(一天)。客户端/浏览器可以缓存预响应的描述。如果这是0(或任何假值),则不会发送max_age标头。

CORS_ALLOW_CREDENTIALS

默认为False。如果为True,cookie将被允许包含在跨站点请求中。
Django2.1版本添加了SESSION_COOKIE_SAMESITE的设置,默认为”LAX”,它将阻止Django的cookie, session被跨域发送。CORS_ALLOW_CREDENTIALS设置为True时,需要将SESSION_COOKIE_SAMESITE设置为None。
Django2.1版本还添加了对CSRF_COOKIE_SAMESITE的设置,默认值为”LAX”,它将组织Django的csrf cookie的跨域使用。需要将CSRF_COOKIE_SAMESITE设置为None,才可以保证csrf跨域的正常使用。

CSRF集成

很多网站都会使用Django提供的跨站点请求伪造保护。但是CORS和CSRF是分开的,Django无法使用CORS配置来免除站点Referer对安全请求所造成的检查。需要对CSRF_TRUSTED_ORIGINS进行设置。
示例:

CORS_ORIGIN_WHITELIST  = [
     'http://change.allowed.com',
] CSRF_TRUSTED_ORIGINS = [
     'change.allowed.com',
]

CSRF_TRUSTED_ORISINS是在Django1.9引入的。在Django1.9之前的版本,需要将CORS_REPLACE_HTTPS_REFERER设置为True,CorsMiddleware则会Referer在CORS检查通过时将标头更改为将传递Django的CSRF检查的内容。其默认值为False。
并在MIDDLEWARE_CLASSES中添加以下设置:

MIDDLEWARE_CLASSES = [
    ...
    'corsheaders.middleware.CorsMiddleware',
    ...
    'django.middleware.csrf.CsrfViewMiddleware',
    'corsheaders.middleware.CorsPostCsrfMiddleware',
    ...
]

iframe标签引用

Django中间件中的django.middleware.clickjacking.XFrameOptionsMiddleware将会对iframe标签进行限制,被其他域名的iframe标签引用时,将不会显示页面。可以通过下面的方法进行允许。

  1. 在中间件中注释掉django.middleware.clickjacking.XFrameOptionsMiddleware
  2. settings.py中添加对X_FRAME_OPTIONS的设置, 其默认值为SAMEORIGIN
    示例:
    X_FRAME_OPTIONS = 'ALLOWALL'  # 表示允许所有的域名使用
    
745人浏览 0条评论 0 收起
2019-07-18 15:42:55
条评论
常用的机器学习数据集
熊熊熊

scikit-learn

数据集对于深度学习模型的重要性不言而喻,然而根据性质、类型、领域的不同,数据集往往散落在不同的资源平台里,急需人们做出整理。少了数据,我们的机器学习和深度学习模型什么也干不了。这么说吧,那些创建了数据集、让我们可以训练模型的 人,都是我们的英雄,虽然这些人常常并没有得到足够的感谢。让人庆幸的是,那批最有价值的数据集后来成了「学术基准线」—...

数据集对于深度学习模型的重要性不言而喻,然而根据性质、类型、领域的不同,数据集往往散落在不同的资源平台里,急需人们做出整理。少了数据,我们的机器学习和深度学习模型什么也干不了。这么说吧,那些创建了数据集、让我们可以训练模型的 人,都是我们的英雄,虽然这些人常常并没有得到足够的感谢。让人庆幸的是,那批最有价值的数据集后来成了「学术基准线」——被研究人员广泛引用,尤其在算法变化的对比上;不少名字则成为圈内外都耳熟能详的名 称,如 MNIST、CIFAR 10 以及 Imagenet 等。

图像分类领域

1)MNIST
经典的小型(28x28 像素)灰度手写数字数据集,开发于20世纪90年代,主要用于测试当时最复杂的模型;到了今日,MNIST 数据集更多被视作深度学习的基础教材。fast.ai版本的数据集舍弃了原始的特殊二进制格式,转而采用标准的PNG格式,以便在目前大多数代码库中作为正常的工作流使用;如果您只想使用与原始同样的单输 入通道,只需在通道轴中选取单个切片即可。
下载地址:https://s3.amazonaws.com/fast-ai-imageclas/mnist_png.tgz

2)CIFAR10
10 个类别,多达 60000 张的 32x32 像素彩色图像(50000 张训练图像和 10000 张测试图像),平均每种类别 拥有 6000 张图像。广泛用于测试新算法的性能。fast.ai版本的数据集舍弃了原始的特殊二进制格式,转而采用标准的 PNG 格式,以便在目前大多数代码库中作为正常的工作流使用。
下载地址:https://s3.amazonaws.com/fast-ai-imageclas/cifar10.tgz

3)CIFAR100
与 CIFAR-10 类似,区别在于 CIFAR-100 拥有 100 种类别,每个类别包含 600 张图像(500 张训练图像和 100 张测试图像),然后这 100 个类别又被划分为 20 个超类。因此,数据集里的每张图像自带一个「精细」标签 (所属的类)和一个「粗略」标签(所属的超类)。

4)Caltech 101
包含 101 种物品类别的图像数据集,平均每个类别拥有 40—800 张图像,其中很大一部分类别的图像数量固为 50 张左右。每张图像的大小约为 300 x 200 像素。本数据集也可以用于目标检测定位。
下载地址:https://s3.amazonaws.com/fast-ai-imageclas/caltech_101.tar.gz

自然语言处理领域

1)IMDb Large Movie Review Dataset
用于情感二元分类的数据集,其中包含 25,000 条用于训练的电影评论和 25,000 条用于测试的电影评论,这些电 影评论的特点是两极分化特别明显。另外数据集里也包含未标记的数据可供使用。
下载地址:https://s3.amazonaws.com/fast-ai-nlp/imdb.tgz

2)Wikitext-103
超过 1 亿个语句的数据合集,全部从维基百科的 Good 与 Featured 文章中提炼出来。广泛用于语言建模,当中 包括 fastai 库和 ULMFiT 算法中经常用到的预训练模型。
下载地址:https://s3.amazonaws.com/fast-ai-nlp/wikitext-103.tgz

3)Wikitext-2
Wikitext-103 的子集,主要用于测试小型数据集的语言模型训练效果。
下载地址:https://s3.amazonaws.com/fast-ai-nlp/wikitext-2.tgz

4)AG News496,835 条来自 AG 新闻语料库 4 大类别超过 2000 个新闻源的新闻文章,数据集仅仅援用了标题和描述字段。 每个类别分别拥有 30,000 个训练样本及 1900 个测试样本。
下载地址:https://s3.amazonaws.com/fast-ai-nlp/ag_news_csv.tgz

目标检测定位

1)Camvid: Motion-based Segmentation and Recognition Dataset
700 张包含像素级别语义分割的图像分割数据集,每张图像都经过第二个人的检查和确认来确保数据的准确性。
下载地址:https://s3.amazonaws.com/fast-ai-imagelocal/camvid.tgz

2)PASCAL Visual Object Classes (VOC)
用于类识别的标准图像数据集——这里同时提供了 2007 与 2012 版本。2012 年的版本拥有 20 个类别。训练数 据的 11,530 张图像中包含了 27,450 个 ROI 注释对象和 6,929 个目标分割数据。
下载地址:https://s3.amazonaws.com/fast-ai-imagelocal/pascal-voc.tgz

694人浏览 0条评论 0 收起
2019-05-10 14:04:11
条评论
全部收起