JJJYmmm Blog
最近写的一个Multi-task框架~ 项目地址:https://github.com/JJJYmmm/Pix2SeqV2-Pytorch Simple PyTorch implementation of Pix2SeqV2. This project references moein-shariatnia's Pix2Seq and the paper A Unified Sequence Interface for Vision Tasks. Introduction Pix2Seq is a generalized framework for solving visual tasks proposed by Google. Essentially it treats visual tasks as language tasks, generating sequences of tokens by auto-regression, and obtaining the output of many visual tasks(e.g., object detection, seg
前言 我认为了解VPN的基本工作原理并实现一个TLS VPN需要以下前置知识: 虚拟专用网络(VPN)。既然要做一个VPN,那么首先需要了解VPN的基本概念,确认需要实现的VPN类型(IPSec VPN或TLS VPN),并大致了解VPN的组成框架; TUN/TAP与隧道。基于TCP隧道实现TLS VPN,那么隧道的概念与分类(基于UDP/TCP)需要有一定了解;另外VPN还使用到了虚拟网卡TUN,所以还需要了解TUN/TAP的工作原理以及使用; 安全套接字层(SSL)。为了保证数据传输的安全性,我们还需要使用同样用在HTTPS上的SSL,SSL介于应用层和运输层(仅限于TCP协议)之间,通过这个我们可以实现对数据的加密; PKI 和 X.509证书。这部分承接SSL,因为SSL握手认证时需要对服务器(客户端)进行身份认证,需要用到证书。既然涉及到证书还需要了解证书的签发者(CA); 身份认证。VPN的身份认证同样是一个重点部分,当然我们既然使用了SSL,说明已经对服务器进行身份认证,接下来只需要对客户端进行身份认证即可。我们这里简单使用Linux下的账户进行登录验
年前分享一篇关于Sequence Packing的论文:2107.02027 笔者认为Packing是Transformer架构训练时一个比较比较核心的问题(应用也非常广泛,LLMs如Llama 3会拼接多个文档做上下文的拓展),因为Transformer一般有一个固定的Context Size S,所有样本都需要pad到S的长度,从而满足transformer的矩阵计算;而pad token是不参与loss计算的,所以这里就带来了Context的浪费;对于一些分布很极端的数据集如Wikipedia,一个epoch下来,pad token要占到所有训练token的50%。 在以上背景下,有两种可以解决pad token过多带来的计算损耗。一个是优化计算流程,使pad token不参与attention这样复杂度高的计算,但是这种方法往往需要非常工程的优化;另一个是降低pad token的比例,也就是所谓的Sequence Packing了——把多个样本或序列拼在一起。 Packing带来的好处是非常明显的:多个样本拼在一起,首先减少了样本数,其次单条数据中有效token的比例也增加,这
发现上次写博客已经是去年8月份了,这小半年发生了很多事儿。 无论如何,希望新的一年可以多分享一些有趣的内容😊
问题来自今日力扣 偶然发现使用std::function定义dfs函数比原生函数或auto定义慢很多,使用斐波那契简单计算一下时间,代码放在最后。 结果如下,可以看到auto和普通定义的递归函数时间开销差不多,而function定义的递归函数慢了快5倍(当然随着计算量增大,倍数会逐渐减小,但还是很慢就是了)。 check fibo(30) <dfs_ori > ret: 1346269 done! 6425ms <dfs_func> ret: 1346269 done! 41189ms <dfs_auto> ret: 1346269 done! 6492ms gpt给出的解释如下,以后还是投入auto怀抱了~ 在C++中,当你使用std::function来包装一个lambda表达式或函数时,可能会发生拷贝构造的情况。这是因为std::function是一个类型安全的函数包装器,可以包含任何可调用对象(函数指针、成员函数指针、函数对象等),因此在构造std::function对象时,会涉及到对象的拷贝构造或移动构造。 在你的情况中,当使用fu
关于CIDEr的介绍可以看这里,个人感觉讲的比较清楚 唯一有个问题是计算TF的时候,提供的公式是term_freq/sum(all term_freqs),但是已知的代码库(如pyciderevalcap)里只有term_freq项,提了一个issue在这里 https://github.com/tylin/coco-caption/issues/66
Python中创建对象时,会涉及__init__和__new__两个函数,个人感觉前者较为常见。 创建对象时发生了什么 创建一个类对象首先会调用该类的__new__方法(接下来省略下划线),new方法本身接受一个类参数cls,一般就是自身,随后会通过super函数得到该类的父类,并调用父类的new方法进行对象的创建(因为所有类都基于object,所以最终都会调用object的new方法) super函数(实际上是类,这里为了简明,使用相同功能的函数替代)的输入为类cls,和某个实例obj,super做的事情就是找到obj的父类并返回,这里我们使用python的mro函数得到obj对象对应类的父类列表。mro这个类方法是python解决多重继承问题的方案,简单理解就是mro会返回调用类的父类链,列表靠前的元素是靠后元素的子类。那么super的做法就是得到obj对象类的mro列表,取出mro列表中cls的后一个元素,也就是cls的最近父类。 def super(cls, obj): mro = obj.__class__.mro() return mro[mro.index
JJJYmmm
Updating as per fate.