- 博客(94)
- 资源 (1)
- 收藏
- 关注
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 樱花盛开的季节
记忆中的远方此时樱花盛开,三月的风会问候四月的海;星辰大海的归途,在那樱花盛开的季节里。无论是习惯了信手涂鸦的画意,还是吟惯了杨柳岸晓风残月的诗意;无论是写下一排排隽永的绯句,还是敲下了一行行错落有致的代码;在这个来去匆匆的季节里,一定不留遗憾!春江海水连海平,海上明月共潮生。
2023-12-21 09:48:26
508
原创 Few-Shot, Zero-Shot & One-shot
效果没有超过 bert,又想发 paper,就把自己的卖点定义为 zero-shot(方法创新),即完全的无监督学习,论文的题目:Language Models are Unsupervised Multitask Learners。效果比 bert 好,不用找学术方法的卖点了,而且,zero-shot 做产品的性价比确实不高,换成了 few-shot,也就是找了一些人做标注。Few-Shot, Zero-Shot & One-shot 的通俗理解 - JackonYang的文章 - 知乎。
2024-04-18 14:31:16
736
原创 重写 重载 重定义
有继承子类(派生类)重新定义父类(基类)的同名成员(非 virtual 函数) 重写(覆盖)有继承子类(派生类)重写父类(基类)的 virtual 函数函数返回值,函数名字,函数参数,必须和基类中的虚函数一致class A{public://同一作用域下,func1 函数重载public://重定义基类的 func2,隐藏了基类的 func2 方法//重写基类的 func3 函数,也可以覆盖基类 func3。
2024-03-11 16:57:34
249
原创 抽象基类和纯虚函数、虚析构函数、纯虚析构函数
在设计时,常常希望基类仅仅作为其派生类的一个接口。这就是说,仅想对基类进行向上类型转换,使用它的接口,而不希望用户实际的创建一个基类的对象。纯虚函数(pure virtual function),使得基类称为抽象类(abstract class). 纯虚函数使用关键字 virtual,并在其后面加上=0。如果试图去实例化一个抽象类,编译器则会阻止这种操作。 当继承一个抽象类的时候,必须实现所有的纯虚函数,否则由抽象类派生的类也是一个抽象类。c++中没有接口的概念,但是可以通过纯虚函数实现接口。虚析构函数作
2024-03-11 16:50:49
463
原创 vector和unorder_map的使用
首先,,顾名思义,size表示当前有多少个元素,capacity是可容纳的大小。因为vector是顺序存储的,那么和数组一样,有一个初始容量,在vector里就是capacity。capacity必然大于等于size,每次扩容时会改变,具体大小和vector底层实现机制有关。如图所示,第一次测容量为0 0,此时没有分配内存。第二次1 1,使用v.push_bak(),插入一个vector的内容,v会自动扩充,
2024-03-11 11:20:55
548
原创 C++ 多态的概述
静态多态(静态联编):函数入口地址 是在 编译阶段 确定(运算符重载、函数重载)注意://如果 Animal没有涉及到继承 函数指针变量 就指向自身sleep。动态多态(动态联编):函数入口地址 是在 运行阶段 确定(虚函数)总结:基类指针、引用 只能访问 子类对象中 基类部分 数据。vfptr虚函数指针 指向的是虚函数表(vftable)多态的分类:静态多态(静态联编)、动态多态(动态联编)使用virtual修饰成员函数 该成员函数就是虚函数。vftable表存放的是 vfptr做保存的函数入口。
2024-03-06 17:02:33
335
原创 算法中常用知识
表达式的意思是对整数21473648取负,但是2147483648已经溢出了int的上限,所以定义为(-INT_MAX -1)。C中int类型是32位的,范围是-2147483648到2147483647。(1)最轻微的上溢是INT_MAX + 1 :结果是 INT_MIN;(2)最严重的上溢是INT_MAX + INT_MAX :结果是-2;(3)最轻微的下溢是INT_MIN - 1:结果是是INT_MAX;(4)最严重的下溢是INT_MIN + INT_MIN:结果是0。
2024-03-05 14:42:15
426
原创 前缀和 + 哈希表优化
我们建立哈希表 mp\textit{mp}mp,以和为键,出现次数为对应的值,记录 pre[i]\textit{pre}[i]pre[i] 出现的次数,从左往右边更新 mp\textit{mp}mp 边计算答案,那么以 iii 结尾的答案 mp[pre[i]−k]\textit{mp}[\textit{pre}[i]-k]mp[pre[i]−k] 即可在 O(1)O(1)O(1) 时间内得到。给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数。
2024-03-04 10:22:12
385
原创 C++中的const总结
用const修饰的成员函数时,const修饰this指针指向的内存区域,成员函数体内不可以修改本类中的任何普通成员变量, 当成员变量类型符前用mutable修饰时例外。
2024-03-03 14:54:03
292
原创 C++模版类
在 C++ 中,和都是模板声明,但它们在模板参数的数量和类型上有所不同。关键字class和typename在这里的使用上基本相同,都用于声明模板参数类型。:这是一个模板声明,它定义了一个带有两个类型参数的模板。NameType和AgeType是这两个类型参数的占位符,可以被任意类型替换。:这种形式通常用于需要两种不同类型参数的情况。例如,你可能有一个类,其中需要两种不同类型的成员变量或方法参数。:这也是一个模板声明,但它只定义了一个单一的类型参数T。T是一个类型参数的占位符,可以被任意类型替换。
2023-12-22 11:23:13
456
原创 导入别的目录下的py文件
是要导入的py文件名。在使用绝对路径导入时,需要将要导入的目录路径添加到。要导入别的目录下的py文件,可以使用相对路径或绝对路径来导入。中,然后再导入相应的py文件。
2023-12-20 09:55:00
492
原创 线程池理解
当某线程被唤醒时,其可能是被异常或是伪唤醒,或者是一些广播类的唤醒线程操作而导致所有线程被唤醒,使得在被唤醒的若干线程中,只有个别线程能拿到任务。线程池当中的线程要从任务队列里拿任务,前提条件是任务队列中必须要有任务,因此线程池当中的线程在拿任务之前,需要先判断任务队列当中是否有任务,若此时任务队列为空,那么该线程应该进行等待,直到任务队列中有任务时再将其唤醒,因此我们需要引入条件变量。思想来实现的线程管理技术,主要是为了复用线程、便利地管理线程和任务、并将线程的创建和任务的执行解耦开来。
2023-12-19 16:49:02
972
原创 Linux 定时器
如代码实现中,第一次设定定时器后,经过3s后才调用sig_alarm_handler函数,因为是一次性的,所以在sig_alarm_handler函数中, int remaing = alarm(2);继续使用alarm函数]返回值是在你调用这个函数的时刻,上一次的 alarm() 所剩余的秒数。例如,你上一次调用了 alarm(10),7秒钟以后你再次调用了alarm(6),那么在 alarm(6) 时返回的值就是 3。参数1 是你想定时的秒数。
2023-12-13 21:32:20
616
原创 编译原理简介
对前面生成的中间代码进行加工变换,以便在最后极端产生更为高效的目标代码 ,需要遵循等价变换的原则,优化的方面包括:公共子表达式的提取、合并已知量、删除无用语句、循环优化。编译的第一个阶段,从左到右逐行扫描源程序的字符,识别出各个单词(是高级语言中有是在意义的最小语法单元,由字符构成),确定单词的类型。对语法分析识别出的各类语法范畴,分析他的含义,进行初步翻译,产生介于源代码和目标代码质检的一种代码。类型 (Type):整型、实型、字符型、布尔型、指针型、…归约:最右归约、最左归约,推导的逆过程就是归约。
2023-12-12 16:56:17
1087
原创 容器技术与操作系统
从图中我们可以看到容器更加的轻量级且占用的资源更少,与操作系统动辄几G的内存占用相比,容器技术只需数M空间,因此我们可以在同样规格的硬件上大量部署容器,这是虚拟机所不能比拟的,而且不同于操作系统数分钟的启动时间容器几乎瞬时启动,容器技术为打包服务栈提供了一种更加高效的方式,So cool。还有另一个问题,那就是启动时间问题,我们知道操作系统重启是非常慢的,因为操作系统要从头到尾把该检测的都检测了该加载的都加载上,这个过程非常缓慢,动辄数分钟,因此操作系统还是太笨了。这是问题一,主要原因在于操作系统太重了。
2023-12-12 16:30:51
1308
原创 vim出现请▒~S▒~E▒(▒~S▒~E▒0▒~@~@▒~G▒)等中文乱码解决方法
需要把/etc/vimrc复制到你自己的根目录下面:复制为.vimrc(前面有个点,作为隐藏文件)然后把上面三句话加入到你的文件中,如下图,保存退出就ok了。全局的情况下:即所有用户都能用这个配置。文件地址:/etc/vimrc。
2023-12-11 12:46:55
569
原创 浅谈可重入与线程安全
但是,如果在单线程背景下第一次执行该函数时已经获得互斥锁进入临界区,这时该函数被重入执行,这将在重新申请互斥锁时被饿死(starvation),因为获得了互斥锁的该函数的第一次执行将永远没有机会再获得CPU时间片。以上代码中,f使用了全局变量 g_var,所以,如果两个线程同时执行它并访问g_var,则返回的结果取决于执行的时间。多线程执行的函数或子程序,各个线程的执行时机是由操作系统调度,不可预期的,但是该函数的每个执行线程都会不时的获得CPU的时间片,不断向前推进执行进度。但是,他们有重大区别。
2023-12-06 19:19:15
935
原创 Nginx知多少
比如:我们访问淘宝的时候,淘宝内部肯定不是只有一台服务器,它的内部有很多台服务器,那我们进行访问的时候,因为服务器中间session不共享,那我们是不是在服务器之间访问需要频繁登录,那这个时候淘宝搭建一个过渡服务器,对我们是没有任何影响的,我们是登录一次,但是访问所有,这种情况就是 反向代理。每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。这种方式比较灵活,当后端服务器性能存在差异的时候,通过配置权重,可以让服务器的性能得到充分发挥,有效利用资源。
2023-12-06 16:26:14
1023
原创 多线程详解2-信号量,进程互斥量,文件锁,fcntl和位图
信号量多用于进程间的同步与互斥同步:处理竞争就是同步,安排进程执行的先后顺序就是同步,每个进程都有一定的个先后执行顺序。互斥:互斥访问不可共享的临界资源,同时会引发两个新的控制问题(互斥可以说是特殊的同步)。竞争:当并发进程竞争使用同一个资源的时候,我们就称为竞争进程。临界区:临界区指的是一个访问共用资源(例如:共用设备或是共用存储器)的程序片段,而这些共用资源又无法同时被多个线程访问的特性。临界资源:只能被一个进程同时使用(不可以多个进程共享),要用到互斥。
2023-12-06 16:19:24
535
原创 大模型概述
AI大模型是通过深度学习算法和人工神经网络训练出的具有庞大规模参数的人工智能模型。这些模型使用大量的多媒体数据资源作为输入,并通过复杂的数学运算和优化算法来完成大规模的训练,以学习和理解到输入数据的模式和特征。这些模式和特征最终通过大模型中庞大的参数进行表征,以获得与输入数据和模型设计相匹配的能力,最终来实现更复杂、更广泛的任务,如语音识别、自然语言处理、计算机视觉等。大模型的训练过程是根据大量的输入数据,通过算法调整模型中庞大的参数来优化模型性能。
2023-12-04 11:58:16
1747
原创 全局变量为什么没有野指针
全局变量是指在程序的任何地方都可以访问的变量,它们通常存储在静态内存区域,也称为数据段。全局变量的作用域是整个程序,不会因为函数的调用或返回而失效,因此指向全局变量的指针不会出现悬挂指针的情况。悬挂指针是指指向已经销毁的局部变量或动态分配的内存的指针。综上所述,全局变量没有野指针是因为它们具有固定的、合法的、可用的内存地址,且不会因为程序的执行而改变或失效。这样可以避免全局变量的值是随机的或不确定的,从而导致指针出错。,不会被释放或改变,因此指向全局变量的指针总是有效的。全局变量为什么没有野指针?
2023-12-04 11:02:03
405
原创 pthread_join()函数
再次强调,一个线程执行结束的返回值只能由一个 pthread_join() 函数获取,当有多个线程调用 pthread_join() 函数获取同一个线程的执行结果时,哪个线程最先执行 pthread_join() 函数,执行结果就由那个线程获得,其它线程的 pthread_join() 函数都将执行失败。在应用中,用pthread_join()函数控制线程的执行流,阻塞调用它的线程,直至目标线程执行结束(接收到目标线程的返回值),阻塞状态才会解除。》一节中做详细讲解。还有一个作用是:获取线程的返回值。
2023-11-30 09:57:57
2854
原创 docker 提示权限不足,不想每次用sudo前缀的方法
创建了一个Linux虚拟机,并且安装为虚拟机安装了docker,想要查看版本信息,结果报错:提示的权限不足,所以加上sudo可以正常查看,但是不想每次都加sudo前缀执行docker。解决方法,把当前用户加入到docker用户组中1: sudo groupadd docker //可以不用执行,默认是安装完docker后,是有docker用户组的2.sudo gpasswd -a [username] docker //根据自己的用户名加上权限。
2023-11-30 09:37:54
670
原创 docker使用
Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。Docker的应用场景Web 应用的自动化打包和发布。自动化测试和持续集成、发布。在服务型环境中部署和调整数据库或其他的后台应用。
2023-11-29 16:01:50
1481
1
原创 VSCode 连接远程服务器问题及解决办法
进入.shh目录,将私钥下载到win上,添加IdentityFile,将vscode上的config路径更改为私钥的存放路径。注意要在linux对应的用户下生成,切换到root改root下得.ssh,应该是连接不上的。可以看到有id_rsa和id_rsa.pub两个文件生成,接着我们再输入命令。端口号不一样,需要在配置文件中添加Port。在vscode界面,终端,生成公钥&私钥。一般来说这个是被注释掉的,把注释打开。然后配置ssh配置文件。
2023-11-23 10:44:15
1094
原创 linux创建用户基本操作
d 目录 指定用户主目录,如果此目录不存在,则同时使用-m选项,可以创建主目录。示例:useradd -d /opt/myuser -m myuser设置密码:passwd myuser#zyq:用户名#x : 密码标志,真正的密码是放在shadow(影子文件)中,并且加密#1000:1000: 分别是UID和GID。UID(用户ID): 0(超级用户),165535(普通用户)。要想修改一个用户为超级用户,只需将UID改为0即可。
2023-11-21 16:49:53
88
原创 基于V100下Llama2-Atom大模型微调
本文–include localhost:0,1,2,3,4,5,6,7。原子大模型Atom在Llama2的基础上,采用大规模的中文数据进行持续预训练,包含百科、书籍、博客、新闻、公告、小说、金融数据、法律数据、医疗数据、代码数据、专业论文数据、中文自然语言处理竞赛数据集等,详见📝 数据来源。通过PEFT加载预训练模型参数和微调模型参数,以下示例代码中,base_model_name_or_path为预训练模型参数保存路径,finetune_model_path为微调模型参数保存路径。
2023-11-21 11:44:42
1076
原创 pytorch与cudatoolkit,cudnn对应关系及安装相应的版本
从驱动和运行时的版本对应关系来看,版本为384.81的驱动程序 对应的 运行时版本是9.0,也就是说我们在python中安装cudatoolkit和cudnn程序包版本9.2是过高了。然后安装对应版本的cudatoolkit和cudnn程序包:pip install cudatoolkit=9.0;因为系统中依赖GPU驱动的程序比较多,一般出现这种情况,我们都是更改cudatoolkit和cudnn程序包的版本。CUDA Version: 12.0 表明当前的显卡驱动可以安装的cuda最高版本是12.0。
2023-11-06 14:27:08
6872
原创 const报错
根据上述原因,我们可以确定,是因为Rectangle类的getUpperRight()和getLowerLeft()函数返回值都不是const限定的,所以,我们只需要修改这俩函数的声明即可。后面在对类中的getXXX()返回类的对象的时候,还是要尽量用const限定。放到我们的代码里,就是下面的两个this的赋值。下面的代码是要重载=运算符,就是将rectangle的左下角和右上角(Point类对象)赋给this的左下角和右上角这两个私有变量。因此,使用-fpermissive将允许编译一些不合格的代码。
2023-11-06 14:25:13
127
原创 基于网络C/S非阻塞模型的epoll ET触发模式
如果这次没有把数据一次性全部读写完(如读写缓冲区太小),那么下次调用 epoll_wait()时,它还会通知你在上没读写完的文件描述符上继续读写,当然如果你一直不去读写,它会一直通知你!例如,当从客户端读固定字节数据时,如果客户端发送的数据不足,则会阻塞在读固定字节函数处,要唤醒这种状态,则需要客户端有新的数据发送过来,但此时需要epoll_wait返回才能知道有新的数据被发送过来,而程序阻塞在读固定字节函数处,而非在epoll_wait处,因此可能导致读数据处的阻塞不能被唤醒;
2023-10-23 14:20:38
169
原创 c语言的缓冲区
缓冲区又称为缓存,它是内存空间的一部分。也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区。缓冲区根据其对应的是输入设备还是输出设备,分为输入缓冲区和输出缓冲区。
2023-10-23 10:40:05
82
原创 网络编程:事件模型关于epoll 边缘触发与水平触发的理解
那么在第5步调用epoll_wait之后将有可能会挂起,因为剩余的数据还存在于文件的输入缓冲区内,而且数据发出端还在等待一个针对已经发出数据的反馈信息。分析:边缘触发,第一次只输出aaaa\n,等到下一次epoll记录到读事件的时候才会发送下一条数据bbbb\n,并且此时缓冲区中会有cccc\ndddd\n数据,时间一长会造成缓冲区数据过多。(2)非阻塞方式:假如需要读的数据读不够n个字节,server会阻塞,epoll不能继续执行,则会产生死锁。(两种触发模式,减少epoll_wait()调用的次数)
2023-10-20 16:38:37
827
原创 解释什么是异步非阻塞?
同步和异步是针对应用程序和内核的交互而言的,同步指的是用户进程触发IO 操作并等待或者轮询的去查看IO 操作是否就绪,而异步是指用户进程触发IO 操作以后便开始做自己的事情,而当IO 操作已经完成的时候会得到IO 完成的通知。阻塞和非阻塞是针对于进程在访问数据的时候,根据IO操作的就绪状态来采取的不同方式,说白了是一种读取或者写入操作方法的实现方式,阻塞方式下读取或者写入函数将一直等待,而非阻塞方式下,读取或者写入方法会立即返回一个状态值。1,公交站有广播的就是非阻塞的。2,公交站没有广播的就是阻塞的。
2023-10-19 19:38:02
119
原创 关于python pytorch 与CUDA版本相关问题
cuda版本确定后,pytorch要依赖此cuda版本,因为pytroch安装跟cuda对应的,比如下图,torch1.11.0只适配cuda10.2、11.3;不适配cuda10.1等其他版本cuda。官网:https://pytorch.org/get-started/previous-versions/CUDA Toolkit版本及可用PyTorch对应关系总结(参考官网)首先在终端中输入python进入python交互式环境。
2023-10-16 18:54:42
1952
1
C++类和对象的基本概念笔记
2022-05-11
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人