首页 文章 精选 留言 我的

精选列表

搜索[窗口预览],共10000篇文章
优秀的个人博客,低调大师

RWKV-8 预览之 DeepEmbed:对端侧友好的稀疏设计,解决 MoE 显存占用

RWKV-8 "Heron" 是我们的下一代架构,具有多个全新技术。在此我们首先公布其中的 DeepEmbed 技术,它可以实现类似 MoE 的优秀推理性能,同时无需占用显存,甚至无需占用内存,可以让稀疏的大模型真正部署到所有端侧设备。 推理代码:https://github.com/BlinkDL/RWKV-LM/blob/main/RWKV-v7/rwkv_v8_rc00_demo.py rwkv-8-pile 模型:https://huggingface.co/BlinkDL/rwkv-8-pile 下文将详细介绍 DeepEmbed 的原理与实现: 什么是 DeepEmbed DeepEmbed 在模型的每一层 FFN 中为词表中的每个 token 训练一个可学习的高维向量,这可以写成 Embed 层。这些向量在训练阶段可被学习,而在推理阶段可存储于 RAM/SSD 中,对于每个 token 只需预读极少量参数,从而显著减少显存占用。 推理时,模型根据 token index 可提前预读本层的 embedding 向量,用于对 FFN 输出进行逐通道的乘性调制(channelwise scaling)。 这些基于 token 的 embedding 向量构成了一个规模庞大但稀疏的知识库,能够显著提升模型存储和调用世界知识的能力。尽管这些向量看似增加了模型参数量,但不需要占用显存,且在训练过程中可通过 TP(Tensor Parallelism)避免 DP(Data Parallelism)中梯度同步的带宽开销,并可进一步 offload 至 RAM 或 SSD。 在端侧推理场景下,这些向量同样可存储于内存中,或通过mmap等机制直接从硬盘按需加载。每个 token 仅引入几十 KB 的额外访存开销,使该机制非常适合在边缘设备上部署。 DeepEmbed 代码示例 原始 ReLuSq FFN: x = torch.relu(self.key(x)) ** 2 return self.value(x) DeepEmbed_1x ReLuSq FFN: self.deepemb = nn.Embedding(d_vocab, d_emb) ... x = torch.relu(self.key(x)) ** 2 return self.value(x) * self.deepemb(idx) DeepEmbed_4x ReLuSq FFN(效果更佳,参数更多): self.deepemb = nn.Embedding(d_vocab, d_emb * 4) ... x = torch.relu(self.key(x)) ** 2 return self.value(x * self.deepemb(idx)) 从代码可以看出,self.deepemb 用于对 FFN 的输出或中间结果进行乘法缩放。这里的 idx 是输入的 token 索引。需要:注意将 self.deepemb 向量初始化为常数 1,以确保训练初期不会干扰模型行为。 self.deepemb 向量并不直接修改 FFN 的参数,而是以 token 为单位,替代了原本基于输入动态生成的门控向量在通道维度上的乘性调制功能,使模型对 token 的语义或类别具备更强的感知能力。 由于查表操作在推理时不占用 VRAM,这些向量在参数量层面几乎是"免费的"。因此,还可以进一步引入 n-gram(如 bigram、trigram),提升模型对词组/片段的建模能力。如果词表规模较大,也可结合 LoRA 技术降低显存和训练开销。 实验结果表明:相较于 baseline,更大规模的 DeepEmbed 能够带来更显著的 loss 改善。 DeepEmbed 技术在 twitter 公布后,引发多方关注, 包括 ViT 作者 Lucas Beyer。 未来我们会逐渐公布 RWKV-8 的更多创新技术。 加入 RWKV 社区 欢迎大家加入 RWKV 社区,可以从 RWKV 中文官网了解 RWKV 模型,也可以加入 RWKV 论坛、QQ 频道和 QQ 群聊,一起探讨 RWKV 模型。 📖 RWKV 中文文档:https://www.rwkv.cn 💬 RWKV 论坛:https://community.rwkv.cn/ 🐧 QQ 频道:https://pd.qq.com/s/9n21eravc 📺 BiliBili 视频教程:https://space.bilibili.com/3546689096910933

优秀的个人博客,低调大师

js判断是否安装某个android app,没有安装下载该应用(websocket通信,监听窗口失去焦点事件)

现在经常有写场景需要提示用户下载app, 但是如果用户已经安装,我们希望是直接打开app。 实际上,js是没有判断app是否已经安装的方法的,我们只能曲线救国。 首先,我们需要有call起app的schema, 以及一个下载地址,比如: var schema = 'myApp://main'; var downUrl = 'https://yourmain.com/downloadUrlTag'; 一、使用websocket通信实现页端和app的通信 1. android app需要实现websocket的连接功能,开放一个特定的端口如8899; 2. 页端js建立websocket连接 1 var download = function (schema, downUrl) { 2 var ws = "ws://localhost:8899/websocket"; 3 4 function onMessage(event) { 5 if (event.data != 'SUCCESS') { 6 console.log(event.data + "!= 'SUCCESS'"); 7 window.location.href = downUrl; 8 } 9 socket.close(); 10 } 11 12 function onError(event) { 13 console.log("websocket error"); 14 window.location.href = downUrl; 15 } 16 17 function onOpen() { 18 } 19 20 function onClose() { 21 } 22 // 判断浏览器 23 if (navigator.userAgent.match(/android/i) && (navigator.userAgent.match(/Chrome/) || navigator.userAgent.match(/Opera/))) { 24 if (window.WebSocket) { 25 try { 26 socket = new WebSocket(ws);27 } catch (ex) { 28 window.location.href = downUrl; 29 } 30 var message = ""; 31 socket.onmessage = onMessage; 32 socket.onopen = onOpen; 33 socket.onclose = onClose; 34 socket.onerror = onError; 35 36 if (socket.readyState == WebSocket.CONNECTING) { 37 setTimeout(function () { // websocket建立连接需要一段时间 38 if (socket.readyState == WebSocket.OPEN) { 39 if (schema != '') { 40 window.location.href = schema; 41 socket.send(message); 42 } 43 } else { 44 socket = new WebSocket(ws);45 if (socket.readyState != WebSocket.OPEN) { 46 window.location.href = downUrl; 47 } 48 } 49 }, 1000); 50 } 51 } 52 } else { 53 window.location.href = downUrl; 54 } 55 }; 当点击下载按钮的时候,调用download(schema,downUrl)方法即可。 但是这种方法存在一个严重的问题:当app不在进程中存活时,我们是无法成功call起的,这样,我们就需要在客户端做一些工作,让你的app一直存活在进程中。 二、监听当前页面是否失去焦点,来判断是否需要调用下载 首先,我们的想法是,当用户点击下载后,先尝试call起APP,使用setTimeout做延时处理,在延时中判断是否call起成功,如果不成功,则直接下载,我们如何认为call其成功呢,当一个应用被调用的时候,浏览器会被隐藏,那么当前页面会失去焦点。 首先,我们的想法是,当用户点击下载后,先尝试call起APP,使用setTimeout做延时处理,在延时中判断是否call起成功,如果不成功,则直接下载,我们如何认为call其成功呢,当一个应用被调用的时候,浏览器会被隐藏,那么当前页面会失去焦点。 var isBlur = false; location.href = schema; setTimeout(function() { if (!isBlur) { location.href = url; } }, 1000); 那么如何来设置isBlur的值呢,这里提供两种方法: 1. 监听window的blur事件 // window 每次失去焦点 window.onblur = function() { console.log('失去焦点'); isBlur = true; }; // window 每次获得焦点 // window.onfocus = function() { // console.log('获得焦点'); // isBlur = false; // } 2. 自定义事件监听visibilityChange事件,来判断document的hidden属性, 简单写法: document.addEventListener("visibilitychange", function(){ console.log(document.hidden ? "失去焦点" : "获得焦点"); isBlur = document.hidden; }); 兼容写法: var hiddenProperty = 'hidden' in document ? 'hidden' : 'webkitHidden' in document ? 'webkitHidden' : 'mozHidden' in document ? 'mozHidden' : null; var visibilityChangeEvent = hiddenProperty.replace(/hidden/i, 'visibilitychange'); var onVisibilityChange = function(){ if (!document[hiddenProperty]) { console.log('获得焦点'); isBlur = false; } else { console.log('失去焦点'); isBlur = true; } } document.addEventListener(visibilityChangeEvent, onVisibilityChange); 完整代码: var download = function() { var isBlur = false; location.href = schema; setTimeout(function() { if (!isBlur) { location.href = url; } }, 1000); // window 每次失去焦点 window.onblur = function() { console.log('失去焦点'); isBlur = true; }; var hiddenProperty = 'hidden' in document ? 'hidden' : 'webkitHidden' in document ? 'webkitHidden' : 'mozHidden' in document ? 'mozHidden' : null; var visibilityChangeEvent = hiddenProperty.replace(/hidden/i, 'visibilitychange'); var onVisibilityChange = function(){ if (document[hiddenProperty]) { console.log('失去焦点'); isBlur = true; } } document.addEventListener(visibilityChangeEvent, onVisibilityChange); } 如果有哪里写的不对的,欢迎讨论!

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册