1.[fastllm]cuda-kernels源码解析
2.U-Net+与FCN的函数函数区别+医学表现+网络详解+创新
3.在Flutter中使用setState时的6个简单技巧
4.UE·UI篇ListView使用经验总结
5.openlayers4 入门开发系列之地图切换篇(附源码下载)
6.openstreetmapå è½½ä¸å
¨
[fastllm]cuda-kernels源码解析
在fastllm中,CUDA-kernels的源码使用是关键优化点之一,主要涉及以下几个高频率使用的函数函数kernel:gemv_int4、gemv_int8、源码gemm_int8、函数函数RMSNorm、源码pchunter源码softmax、函数函数RotatePosition2D、源码swiglu等。函数函数其中,源码gemm是函数函数计算密集型的,而其余大部分都是源码内存受限型。利用量化bit进行计算,函数函数比原始的源码torch转为浮点数更快,同时,函数函数没有进行融合操作,为后续优化留下了空间。
gemv_int4 kernel:主要用于实现float*int4的GEMV乘积,其中偏置值设定为最小值。在计算中,矩阵被划分为不同的tile,不同tile之间并行操作。在遍历m/2的过程中,找到对应int4值的位置,通过保存的mins找到最小值minv。同一组的两个int4值共享同一个minv,计算结果的最终和被保存在sdata[0]上,用于更新对应m列位置的macd交易模型源码output值。结果向量为n*1。
gemv_int8 kernel:在功能上与gemv_int4类似,但偏置值由保存的minv变为了zeros。
gemm_int8 kernel:此kernel负责计算n*m矩阵与m*k矩阵的乘积。计算过程涉及多个tile并行,block内部保存的是部分和。考虑到线程数量限制,通常会有优化空间。最终结果通过为单位进行更新。
layerNorm实现:此kernel实现layernorm计算,通过计算均值和方差来调整数据分布。计算中,sdata存储所有和,sdata2存储平方和。每个block内计算部分和后,规约得到全局的均值和方差,从而更新output。
RMS kernels解析:RMSNorm kernel实现RMS归一化,通过计算输入的平方和和均值,进而更新output。
softmax kernels解析:计算输入的softmax值,涉及最大值查找、指数计算和规约求和等步骤,以防止浮点数下溢。
RotatePosition2D Kernels解析:用于旋转位置编码,线程展开成三层循环。LlamaRotatePosition2D、保卫萝卜源码 unityNearlyRotatePosition和RotatePosition2D在旋转方式上有所区别,体现在不同的位置上进行计算。
AttentionMask Kernels解析:对输入按照mask掩码置值,普通mask直接置为maskv,而Alibimask则是置为相对位置的值之和。具体含义可能涉及空间上的概念,但文中未详细说明。
swiglu kernels解析:作为激活函数,这些kernel在原地操作中执行常见函数,线程足够使用,直接按照公式计算即可。
综上所述,fastllm中CUDA-kernels的使用旨在通过优化计算过程和内存操作,提升模型的计算效率,实现更高效的推理和训练。
U-Net+与FCN的区别+医学表现+网络详解+创新
UNet论文: 地址 UNet源代码: 地址 UNet和FCN的区别 UNet相比FCN,结构更加对称,解码部分采用合并操作(concatenation)而非FCN的加法操作(summation),FCN的解码部分较为简单,仅使用反卷积,UNet在反卷积后通过合并操作补充特征信息,提高了分割精度。 UNet在医学图像分割中的表现 UNet在医学图像分割中表现良好,其原因在于医学图像的特点,如高分辨率、局部特征明显等。UNet的波段王模型源码编码部分提取局部特征,解码部分通过反卷积与合并操作恢复特征尺寸,提高了分割精度。 UNet网络模型 UNet由编码路径和解码路径组成。编码路径用于特征提取,降低分辨率以增强模型对小扰动的鲁棒性。解码路径利用编码路径的抽象特征恢复图像尺寸,合并操作补充信息,减少上采样时的信息损失。 UNet的创新点 UNet的创新点包括Overlap-tile策略,通过镜像填充预处理图像,使输出尺寸与输入尺寸相同,同时提供上下文信息提高预测精度。数据增强策略,通过随机弹性变形增加数据量。加权损失函数,通过预先计算权重图调整不同像素的损失权重,强化边缘学习。 UNet的不足与改进 UNet++作者分析了UNet的不足,并提出了改进方法,包括网络结构的优化和数据增强策略的改进。 拓展应用 UNet适用于大尺寸医学图像的分割,通过切块处理,UNet能够提供边缘信息,克服分割区域边缘处理问题。UNet家族的发展包括了UNet++等改进模型,进一步提高了分割性能。在Flutter中使用setState时的量能异动源码附图6个简单技巧
setState函数是在Flutter应用程序中管理状态的最基本方法。以下是一些保持应用可维护性的最佳实践。StatefulWidget的setState函数是一种在Flutter应用程序中管理状态的简单方法。但是,当您希望您的应用程序正常工作和高性能时,您需要避免几个陷阱。以下是您应该坚持的一些最佳实践。
setState有什么用?setState是Flutter发出rebuild(重建)当前widget及其后代的方式。在rebuild过程中,最新的变量值将被用于创建用户界面。比方说,一个用户将一个开关从打开切换到关闭。该开关有一个存储该值的支持变量,所以在改变之后,它被设置为false。开关本身并不反映这一变化,直到它被重建为新的支持字段值。
更改值
调用setState()
用户界面已更新
?技巧1:保持##widgets小!setState触发了对你当前所在的小组件的重建。如果你的整个应用程序只包含一个widget,那么整个widget将被重建,这将使你的应用程序变得缓慢。请看下面的例子。
import'package:flutter/material.dart';classHomeextendsStatefulWidget{ constHome({ Key?key}):super(key:key);@overrideState<Home>createState()=>_State();}class_StateextendsState<Home>{ bool_tile1=false;bool_tile2=false;bool_tile3=false;bool_tile4=false;bool_tile5=false;@overrideWidgetbuild(BuildContextcontext){ print("builtmethodHome");//<--setStatetriggersbuildhere!returnScaffold(appBar:AppBar(title:constText("Demo")),body:Center(child:Column(crossAxisAlignment:CrossAxisAlignment.center,mainAxisAlignment:MainAxisAlignment.center,children:<Widget>[SwitchListTile(activeColor:Colors.green,inactiveThumbColor:Colors.red,title:Text("Switchis${ _tile1?"on":"off"}"),value:_tile1,onChanged:(_){ setState((){ _tile1=!_tile1;});}),SwitchListTile(activeColor:Colors.green,inactiveThumbColor:Colors.red,title:Text("Switchis${ _tile2?"on":"off"}"),value:_tile2,onChanged:(_){ setState((){ _tile2=!_tile2;});}),SwitchListTile(activeColor:Colors.green,inactiveThumbColor:Colors.red,title:Text("Switchis${ _tile3?"on":"off"}"),value:_tile3,onChanged:(_){ setState((){ _tile3=!_tile3;});}),SwitchListTile(activeColor:Colors.green,inactiveThumbColor:Colors.red,title:Text("Switchis${ _tile4?"on":"off"}"),value:_tile4,onChanged:(_){ setState((){ _tile4=!_tile4;});}),SwitchListTile(activeColor:Colors.green,inactiveThumbColor:Colors.red,title:Text("Switchis${ _tile5?"on":"off"}"),value:_tile5,onChanged:(_){ setState((){ _tile5=!_tile5;});})])));}}这里我们在一个Column中有5个SwitchListTile小部件,它们都是同一个小部件的一部分。
如果您切换任何控件,整个屏幕都会被重建。Scaffold,AppBar,Column,...但只要重建已更改的小部件就足够了。让我们看下一个代码示例:
import'package:flutter/material.dart';classHome2extendsStatefulWidget{ constHome2({ Key?key}):super(key:key);@overrideState<Home2>createState()=>_State();}class_StateextendsState<Home2>{ @overrideWidgetbuild(BuildContextcontext){ print("builtmethodHome2");returnScaffold(appBar:AppBar(title:constText("Demo")),body:Center(child:Column(crossAxisAlignment:CrossAxisAlignment.center,mainAxisAlignment:MainAxisAlignment.center,children:const<Widget>[Switch(),Switch(),Switch(),Switch(),Switch()])));}}classSwitchextendsStatefulWidget{ constSwitch({ Key?key}):super(key:key);@overrideState<StatefulWidget>createState()=>_SwitchState();}class_SwitchStateextendsState<Switch>{ bool_value=false;@overrideWidgetbuild(BuildContextcontext){ print("buildmethodSwitch");//<--setStatetriggersbuildhere!returnSwitchListTile(activeColor:Colors.green,inactiveThumbColor:Colors.red,title:Text("Switchis${ _value?"on":"off"}"),value:_value,onChanged:(_){ setState((){ _value=!_value;});});}}在这里,我们将SwitchListTile包装在单个StatefulWidget中。页面看起来相同,但如果您单击此示例中的任何开关,则只有单击的小部件将重建。
?技巧2:不要在构建方法中调用setState来自FlutterAPI文档
这个方法有可能在每一帧中被调用,除了建立一个小部件外,不应该有任何副作用。
build方法旨在构建小部件树,因此我们应该保持这种方式。不要在这里做花哨的事情,它会减慢你的应用程序。对setState的调用可能会触发额外的重建,在最坏的情况下,你可能最终会出现一个异常,告诉你目前有一个重建正在进行。
?技巧3:不要在initState方法中调用setStateinitState将在完成后触发重建,因此无需在此方法中调用setState。此方法旨在初始化与状态相关的属性,例如设置默认值或订阅流。不要在这里做任何其他事情!
?技巧4:setState()和setState(...)是相等的像这样使用setState没关系
setState((){ _text=“Hello”;});或者像这样
_text=“Hello”;setState((){ });结果是一样的。
?技巧5:setState(...)代码必须很小不要在setState内做任何大的计算,因为它将阻止你的应用程序重绘。请看下面的示例代码:
setState((){ for(vari=0;i<;i++)print(i);_value=true;});只有在打印语句之后,小部件才会重建。在这段时间里,你的应用程序不会对用户的操作做出反应,它将在之后执行这些操作。因此,如果用户因为没有视觉反馈而多次点击一个控件,多次重建就会堆积起来,会使应用程序的速度更慢。
一个更好的方法是在执行一个长期运行的操作时显示一个进度指示器,这样用户就知道正在发生一些事情,他需要等待完成。
?技巧6:setState(...)代码不能是异步的运行代码时
setState(()async{ awaitFuture.delayed(constDuration(seconds:5));});你最终会得到一个类似这样的异常信息:
在方法之外执行异步操作,然后调用它。
结束我希望这些见解能帮助你更好地理解Flutter中setState的机制。坚持这些技巧,你会有更少的问题和更快的应用程序。源代码例子可以在GitHub上找到。
原文:/post/
UE·UI篇ListView使用经验总结
本文总结了我在使用ListView时遇到的一些问题和经验,以及如何解决这些问题。
在使用ListView时,需要了解数据和表现是分开的,数据是UObject类型,表现是UWidget类型。ListView会动态填充需要显示的数据给UI,因此在子物体(继承IUserObjectListEntry接口)的代码逻辑里修改数据必定无效。
关于ListView的滚动条,可以通过调用SetScrollBarVisibility方法来控制其显示状态。若需在蓝图中预览,可连上EventPreConstruct事件。然而,ListView自带的滚动条样式不支持自定义,需要通过改源码或从头写一个ListView来实现。
若想实现鼠标左键滚动,可以使用方法1或方法2,具体取决于ListView、TileView、ScrollBox等组件的使用情况。若遇到子物体(如Button)导致ListView无法滚动的问题,可以尝试将Button的Interaction里的ClickMethod和TouchMethod设置为Precisexxx选项。
更新界面时,不能在EntryWidget中修改数据。解决方法是使用其他方式更新数据,如触发事件、调用方法等。
关于使用Touch实现鼠标左键滑动功能的思考,源于对源码的深入探索。通过查找STableViewBase类的函数,发现左键点击不会触发OnMouseEnter函数,而会触发OnTouch相关函数。因此,通过使用Touch实现鼠标左键滑动的思路得以形成。最终,通过搜索相关关键词,找到了实现答案。
总结来说,开源资源对于解决问题非常有价值。在遇到困难时,深入研究源码和搜索相关关键词往往能提供有效的解决方案。
openlayers4 入门开发系列之地图切换篇(附源码下载)
开放层4入门开发系列之地图切换篇
1.基于开放层4实现地图切换效果
2.源代码demo下载
开放层4地图切换篇的核心是使用开放层4来加载不同类型的地图服务,实现地图切换功能,下图展示了效果:
核心应用到开放层4的核心类如下:
1.开放层4加载瓦片地图类,详情见官方API说明,包含函数、属性及事件等。
2.开放层4的ol.layer.Tile加载瓦片XYZ目录访问数据源,详情见官方API说明。
3.开放层4加载ArcGIS Rest服务地图服务数据源,详情见官方API说明。
4.开放层4加载ArcGIS Rest服务地图服务数据源,详情见官方API说明。
5.开放层4加载WMS瓦片服务地图数据源,详情见官方API说明。
6.开放层4加载OSM在线地图数据源,详情见官方API说明。
地图切换篇的核心代码实现流程如下:
1.地图配置参数说明:server:地图服务类型,当前参数值包括geoserver、arcgisserver、osm、gaode、tianditu,分别代表geoserver服务、arcgis服务器服务、OSM在线地图、高德地图、天地图。
2.开放层4加载arcgis服务器地图服务。
3.开放层4加载OSM在线地图服务。
4.开放层4加载天地图在线地图服务。
5.开放层4加载高德在线地图服务。
6.开放层4加载第三方arcserverrest服务的离线瓦片。
7.开放层4加载arcserverrest的本地切片,加载arcserver本地切片时,其resolutions、origin、extent的设置与上述一致。arcserver切片也是xyz排列存储。
感兴趣的伙伴们,私聊我获取源代码,价格为8.8元。
openstreetmapå è½½ä¸å ¨
1ãé¦å æ¾å°å¹¶æå¼osmæ件æºç å·¥ç¨ä½ç½®ã
2ãå ¶æ¬¡å¨"qgeotileproviderosm.cpp"æ件ç TileProvider::onNetworkReplyFinishedå½æ°ä¸ï¼å°å°åéå®åè¡ä¿®æ¹ã
3ãç¶åéæ°ç¼è¯è¯¥æ件ï¼ç¼è¯å¥½çæ件ä½äºQtå®è£ çç¬¦æ ¹ç®å½ä¸ã
4ãæåå¨çº¿å è½½ã