1.å¦ä½å°åºç¨å®è£
å°/system/appä¸
2..cp是实现什么意思?
3.判断是否有权限cp命令
4.[转]Megatron-LM源码系列(八): Context Parallel并行
5.å¨linuxä¸installå½ä»¤åcpå½ä»¤çåºå«
6.源码详解系列(八)--全面讲解HikariCP的使用和源码
å¦ä½å°åºç¨å®è£ å°/system/appä¸
å¨ Android ä¸ï¼å¦æè¦ä½¿ç¨ç³»ç»éå¶çæéï¼æ¯å¦ android.permission.WRITE_SECURE_SETTINGSï¼ï¼æ们éè¦æç¨åºå®è£ å° /system/app/ ä¸ã
ä¸é¢ä»¥ SecureSetting.apk 为ä¾ï¼æ¼ç¤ºè¿ä¸ªæä½ãéè¦åå¤ä¸å°å·²ç»è·å¾ Root æéçææºã
1ãéè¿ USB è¿æ¥ææºåçµèã
2ãä½¿ç¨ adb æ§å¶ææºã
æºç æå°ï¼
1. $ adb push SecureSetting.apk /sdcard/ // ä¸ä¼ è¦å®è£ çæ件ï¼ä¸ºå®è£ ååå¤ã
2. $ adb shell
3. $ su // åæ¢å° root ç¨æ·ãå¦æ没æè·å¾ Root æéï¼è¿ä¸æ¥ä¸ä¼æåã
4. # mount -o remount,rw -t yaffs2 /dev/block/mtdblock3 /system // 让ååºå¯åã
5. # cat /sdcard/SecureSetting.apk > /system/app/SecureSetting.apk // è¿ä¸æ¥å¯ä»¥ç¨ cp å®ç°ï¼ä½ä¸è¬è®¾å¤ä¸æ²¡æå å«è¯¥å½ä»¤ãå¦æä½¿ç¨ mv ä¼åºç°é误ï¼failed on '/sdcard/NetWork.apk' - Cross-device linkã
6. # mount -o remount,ro -t yaffs2 /dev/block/mtdblock3 /system // è¿åååºå±æ§ï¼åªè¯»ã
7. # exit
8. $ exit
$ adb push SecureSetting.apk /sdcard/ // ä¸ä¼ è¦å®è£ çæ件ï¼ä¸ºå®è£ ååå¤ã
$ adb shell
$ su // åæ¢å° root ç¨æ·ãå¦æ没æè·å¾ Root æéï¼è¿ä¸æ¥ä¸ä¼æåã
# mount -o remount,rw -t yaffs2 /dev/block/mtdblock3 /system // 让ååºå¯åã
# cat /sdcard/SecureSetting.apk > /system/app/SecureSetting.apk // è¿ä¸æ¥å¯ä»¥ç¨ cp å®ç°ï¼ä½ä¸è¬è®¾å¤ä¸æ²¡æå å«è¯¥å½ä»¤ãå¦æä½¿ç¨ mv ä¼åºç°é误ï¼failed on '/sdcard/NetWork.apk' - Cross-device linkã
# mount -o remount,ro -t yaffs2 /dev/block/mtdblock3 /system // è¿åååºå±æ§ï¼åªè¯»ã
# exit
$ exit
éå¯ï¼å¯ä»¥çå° SecureSetting å·²ç»å®è£ 好ã
.cp是什么意思?
“。cp”是源码一种文件格式后缀,英文全称是实现“C++ source file”,意思是源码C++源代码文件。当我们用C++语言编写程序时,实现我们通常需要使用一个文本编辑器编写程序代码,源码梦千年源码并将程序代码保存为.cp文件格式。实现cp文件包含了程序的源码源代码,可以用编译器将其转换为可执行的实现程序。
.cp文件是源码用来编写和存储C++程序的源代码文件。通常情况下,实现程序员会使用一个文本编辑器(如Notepad++、源码Sublime Text等)来编写程序代码,实现idea servlet源码并将其存储为.cp文件格式。源码这样做的实现好处是可以将代码进行版本控制,以便记录程序的历史修改记录,并保留之前版本的代码,方便以后的追溯和比对。
如果想要打开并编辑.cp文件,我们需要一个文本编辑器。常见的文本编辑器有Notepad++、Sublime Text等。在打开.cp文件时,最好使用专业的编程工具进行编辑,比如Visual Studio。gzipped源码tarball这些工具可以自动识别和高亮显示C++语言的关键字,提高编程效率和体验。另外,如果想要运行.cp文件,需要使用C++编译器将源代码转换为可执行文件,然后在计算机上运行即可。
判断是否有权限cp命令
有权限。cp命令能够使用的前提是对于要复制的文件,cp命令的执行者至少要具备读权限r,这是因为复制文件至少要知道文件的内容吧。就像一个可执行文件,如果它的绑定Tomcat源码权限是可读,那么证明执行者至少可以阅读文件的源代码,既然可以阅读了,那么复制一个跟他模仿源代码自己再写一个道理是一样的。所以文件可读就证明它可以被复制了。
[转]Megatron-LM源码系列(八): Context Parallel并行
原文链接: Megatron-LM源码系列(八): Context Parallel并行
Context Parallel并行(CP)与sequence并行(SP)相比,核心差异在于SP只针对Layernorm和Dropout输出的activation在sequence维度进行切分,而CP则进一步扩展,对所有input输入和所有输出activation在sequence维度上进行切分,形成更高效的并行处理策略。除了Attention模块外,其他如Layernorm、Dropout等模块在CP并行中无需任何修改,宽搜源码因为它们在处理过程中没有涉及多token间的交互。
Attention模块之所以特殊,是因为在计算过程中,每个token的查询(query)需要与同一sequence中其他token的键(key)和值(value)进行交互计算,存在内在依赖性。因此,在进行CP并行时,计算开始前需要通过allgather通信手段获取所有token的KV向量,反向计算时则通过reduce_scatter分发gradient梯度。
为了降低显存使用,前向计算阶段每个GPU仅保存部分KV块,反向阶段则通过allgather通信获取全部KV数据。这些通信操作在特定的rank位置(相同TP组内)进行,底层通过send和recv等操作实现allgather和reduce_scatter。
以TP2-CP2的transformer网络为例,CP并行的通信操作在Attention之前执行,其他则为TP通信。AG表示allgather,RS表示reduce_scatter,AG/RS表示前向allgather反向reduce_scatter,RS/AG表示前向reduce_scatter反向allgather。
TP2对应为[GPU0, GPU1], [GPU2, GPU3],CP2指的就是TP组相同位置的rank号,即[GPU0, GPU2], [GPU1, GPU3]。CP并行类似于Ring Attention,但提供了OSS与FlashAttention版本,并去除了冗余的low-triangle causal masking计算。
LLM常因序列长度过长而导致显存耗尽(OOM)。传统解决方法包括重计算或扩大TP(tensor parallel)大小,但各自存在计算代价增加或线性fc计算时间减少与通信难以掩盖的问题。CP则能更高效地解决这一问题,每个GPU处理一部分序列,同时减少CP倍的通信和计算量,同时保持TP不变,使得activation量也减少CP倍。性能优化结果展示于图表中,用户可通过指定--context-parallel-size在Megatron中实现CP。
具体源码实现以Megatron-Core 0.5.0版本为例进行说明。
参考资料:
å¨linuxä¸installå½ä»¤åcpå½ä»¤çåºå«
åºæ¬ä¸ï¼å¨Makefileéä¼ç¨å°installï¼å ¶ä»å°æ¹ä¼ç¨cpå½ä»¤ã
å®æåæ ·çä»»å¡ââæ·è´æ件ï¼ä¸¤è ä¹é´çåºå«ä¸»è¦å¦ä¸ï¼
1ãæéè¦çä¸ç¹ï¼å¦æç®æ æ件åå¨ï¼cpä¼å æ¸ ç©ºæ件åå¾éåå ¥æ°æ件ï¼èinstallåä¼å å é¤æåå çæ件ç¶ååå ¥æ°æ件ãè¿æ¯å 为å¾æ£å¨
使ç¨çæ件ä¸åå ¥å 容å¯è½ä¼å¯¼è´ä¸äºé®é¢ï¼æ¯å¦è¯´åå ¥æ£å¨æ§è¡çæ件å¯è½ä¼å¤±è´¥ï¼æ¯å¦è¯´å¾å·²ç»å¨æç»åå ¥çæ件å¥æä¸åå ¥æ°æ件ä¼äº§çé误çæ件ãè使ç¨
installå å é¤ååå ¥ï¼ä¼çææ°çæ件å¥æï¼çæ¹å¼å»å®è£ å°±è½é¿å è¿äºé®é¢äºï¼
2ãinstallå½ä»¤ä¼æ°å½å°å¤çæ件æéçé®é¢ãæ¯å¦è¯´ï¼install -cä¼æç®æ æ件çæé设置为rwxr-xr-xï¼
3ãinstallå½ä»¤å¯ä»¥æå°åºæ´å¤æ´åéçdebugä¿¡æ¯ï¼è¿ä¼èªå¨å¤çSElinuxä¸ä¸æçé®é¢ã
源码详解系列(八)--全面讲解HikariCP的使用和源码
源码详解系列(八):HikariCP深度剖析
HikariCP是一个高效数据库连接池,它的核心在于通过“池”复用连接,减少创建和关闭连接的开销。本文将全面介绍HikariCP的使用方法和源码细节。使用场景与内容
本文将涉及HikariCP的以下内容:如何获取连接对象并进行基本操作
项目环境设置,包括JDK、Maven版本和依赖库
如何配置HikariCP,包括依赖引入和配置文件编写
初始化连接池,以及通过JMX进行管理
源码分析,重点讲解ConcurrentBag和HikariPool类,以及其创新的“标记模型”
HikariDataSource的两个HikariPool的用意和加载配置
核心原理
HikariCP的性能优势主要源于其“标记模型”,通过减少锁的使用,提高并发性能。它使用CopyOnWriteArrayList来保证读操作的效率,结合CAS机制实现无锁的借出和归还操作。源码亮点
源码简洁且易读,特别是ConcurrentBag类,它是HikariCP的核心组件。类结构与DBCP2类似,包含一个通用的资源池,可以应用于其他需要池化管理的场景。总结
通过本文,读者可以深入了解HikariCP的工作原理,掌握其配置和使用技巧,以及源码实现。希望本文对数据库连接池有深入理解的开发者有所帮助。参考资料:
linuxä¸cpå½ä»¤å¦ä½ç¨ Cè¯è¨å®ç°
1ï¼é¦å éè¦äºè§£cpçåçã2ï¼å¯ä»¥åècpçæºç å»äºè§£å ¶åç
3ï¼cpå½ä»¤çæºç å¯ä»¥å¨linuxå æ ¸ä¸æ¾å°ã
4ï¼æè ä¸è½½busyboxå ¶ä¸ä¹ä¼æcpçæºç
åªæäºè§£å ¶åçä¹åæè½è°å¦ä½å®ç°ãåè代ç å¦ä¸ï¼
#include <stdio.h>#include <stdlib.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <errno.h>
#include <unistd.h>
#include <string.h>
#define BUF_SIZE
#define PATH_LEN
void my_err(char *err_string, int line )
{
fprintf(stderr,"line:%d ",line);
perror(err_string);
exit(1);
}
void copy_data(const int frd,const int fwd)
{
int read_len = 0, write_len = 0;
unsigned char buf[BUF_SIZE], *p_buf;
while ( (read_len = read(frd,buf,BUF_SIZE)) ) {
if (-1 == read_len) {
my_err("Read error", __LINE__);
}
else if (read_len > 0) { //æ读åé¨ååå ¥ç®æ æ件
p_buf = buf;
while ( (write_len = write(fwd,p_buf,read_len)) ) {
if(write_len == read_len) {
break;
}
else if (write_len > 0) { //åªåå ¥é¨å
p_buf += write_len;
read_len -= write_len;
}
else if(-1 == write_len) {
my_err("Write error", __LINE__);
}
}
if (-1 == write_len) break;
}
}
}
int main(int argc, char **argv)
{
int frd, fwd; //读åæ件æ述符
int len = 0;
char *pSrc, *pDes; //åå«æåæºæ件路å¾åç®æ æ件路å¾
struct stat src_st,des_st;
if (argc < 3) {
printf("ç¨æ³ ./MyCp <æºæ件路å¾> <ç®æ æ件路å¾>\n");
my_err("arguments error ", __LINE__);
}
frd = open(argv[1],O_RDONLY);
if (frd == -1) {
my_err("Can not opne file", __LINE__);
}
if (fstat(frd,&src_st) == -1) {
my_err("stat error",__LINE__);
}
/*æ£æ¥æºæ件路å¾æ¯å¦æ¯ç®å½*/
if (S_ISDIR(src_st.st_mode)) {
my_err("ç¥è¿ç®å½",__LINE__);
}
pDes = argv[2];
stat(argv[2],&des_st);
if (S_ISDIR(des_st.st_mode)) { //ç®æ è·¯å¾æ¯ç®å½ï¼å使ç¨æºæ件çæ件å
len = strlen(argv[1]);
pSrc = argv[1] + (len-1); //æåæåä¸ä¸ªå符
/*å æ¾åºæºæ件çæ件å*/
while (pSrc >= argv[1] && *pSrc != '/') {
pSrc--;
}
pSrc++;//æåæºæ件å
len = strlen(argv[2]);
// . 表示å¤å¶å°å½åå·¥ä½ç®å½
if (1 == len && '.' == *(argv[2])) {
len = 0; //没æç³è¯·ç©ºé´ï¼åé¢å°±ä¸ç¨éæ¾
pDes = pSrc;
}
else { //å¤å¶å°æç®å½ä¸ï¼ä½¿ç¨æºæ件å
pDes = (char *)malloc(sizeof(char)*PATH_LEN);
if (NULL == pDes) {
my_err("malloc error ", __LINE__);
}
strcpy(pDes,argv[2]);
if ( *(pDes+(len-1)) != '/' ) { //ç®å½ç¼ºå°æåç'/'ï¼åè¡¥ä¸â/â
strcat(pDes,"/");
}
strcat(pDes+len,pSrc);
}
}
/* æå¼ç®æ æä»¶ï¼ ä½¿æéä¸æºæ件ç¸å*/
fwd = open(pDes,O_WRONLY | O_CREAT | O_TRUNC,src_st.st_mode);
if (fwd == -1) {
my_err("Can not creat file", __LINE__);
}
copy_data(frd,fwd);
//puts("end of copy");
if (len > 0 && pDes != NULL)
free(pDes);
close(frd);
close(fwd);
return 0;
}