上一篇文章《GPT大语言模型Alpaca-lora本地化部署实践》介绍了斯坦福大学的Alpaca-lora模型的本地化部署,并验证了实际的推理效果。
总体感觉其实并不是特别理想,原始Alpaca-lora模型对中文支持并不好,用52k的中文指令集对模型进行fine-tuning之后,效果依然达不到网上说的媲美GPT-3.5的推理效果,验证了那句话:“事不目见耳闻,而臆断其有无,可乎?”
在具有3块Tesla P40显卡的服务器上,利用3块GPU显卡加载模型参数和计算,进行一次简单的推理(非数学运算和逻辑运算)也需要大概30s-1min的时间,效率简直慢的惊人。在京东云GPU云主机部署上,虽然推理效率提高了很多,用中文数据集对模型进行了fine-tuning,然而对中文的支持也并不是很好,经常会出现乱码、重复问题、词不达意等情况。
最近大模型也同雨后春笋般的层出不穷,各个大厂和科研机构都推出了自己的大模型,其中基于LLaMA(开源且好用)的最多,所以决定再看看其他模型,有没有推理效果好,中文支持好,同时推理效率高的模型。
经过筛选,Vicuna-13B的推理效果据说达到了ChatGPT的90%以上的能力,优于LLaMA-13B和Alpaca-13B的效果(具体如下图所示)。评估方法是对各个模型Alpaca、LLaMA、ChatGPT和Bard输入同样的问题,然后通过GPT-4当裁判对推理结果进行打分,以ChatGPT的回答作为100分,回答越接近得分越高(虽然评估方法并不科学,但是目前看也没有更好的办法对模型推理结果进行更科学的评估)。
同时Vicuna的训练成本也很低,据说只需要$300左右,所以尝试本地化部署一下Vicuna-7B,看看效果如何,说干就干。
由于之前本地化部署过Alpaca-lora模型了,本以为可以直接下载开源包,简单部署一下就可以看到效果了,结果发现我还是“too young,too simple”了,环境部署和解决包冲突的过程竟然比第一次部署Alpaca-lora模型还要费劲。
简单的复述一下部署流程,详细的可以参考上一篇内容《GPT大语言模型Alpaca-lora本地化部署实践》。
由于Vicuna 是基于LLaMA模型的,为了符合LLaMA 模型license授权,仅发布了 delta 权重,所以我们需要将原始llama-7b模型与delta模型权重合并之后,才能得到vicuna权重。
首先是下载llama-7b模型,由于文件比较大,所以用lfs直接从文件服务器上下载,大小有26G,执行:
git lfsclonehttp://huggingface.co/decapoda-research/llama-7b-hf
然后是下载delta模型,执行:
git lfsclonehttp://huggingface.co/lmsys/vicuna-7b-delta-v1.1
下载完成后进行权重合并,执行:
python -m fastchat.model.apply_delta \ --base ./model/llama-7b-hf \ --delta ./model/vicuna-7b-delta-v1.1 \ --target ./model/vicuna-7b-all-v1.1
这个合并过程会很快,最终结果如下,合并之后参数大小变成了13G。
合并之后的目录下会有配置文件和数据文件。
Vicuna主要用到3个依赖包,fschat、tensorboardX和flash-attn,前2个安装比较顺利,直接pip install fschat、tensorboardX即可安装完成。flash-attn安装遇到了问题,一直报以下错误:
经过一番检索,发现是gcc版本太低导致的,需要升级gcc,首先查看了一下本地的gcc版本,gcc -v和g++ -v发现是4.8.5的,确实是太低了,那么既然要升级,就升级到最新版,直接下载13.1版本,可以在
http://ftp.gnu.org/gnu/gcc/选择想要安装的版本,这里选择的是gcc-13.1.0.tar.gz。
执行:
tar -xzf gcc-13.1.0.tar.gz
cd gcc-13.1.0
./contrib/download_prerequisites
mkdir build
cd build/
../configure -enable-checking=release -enable-languages=c,c++ -disable-multilib
然后执行make编译,注意这里make时间会非常长,可能会持续几个小时,可以使用 make -j 8让make最多运行8个编译命令同时运行,加快编译速度。
顺利完成后,我们再执行make install进行安装。
然后用gcc -v和g++ -v验证版本是否已经更新,如果提示如下,说明安装完成。
然后我们需要卸载原有的gcc和g++,切换到root权限,执行yum -y remove gcc g++。
配置新版本全局可用,执行ln -s /usr/local/bin/gcc /usr/bin/gcc。
更新链接库,执行:
查看原链接库:strings /usr/lib64/libstdc++.so.6 | grep CXXABI
删除原链接库:rm -f /usr/lib64/libstdc++.so.6
建立软连接:ln -s /usr/local/lib64/libstdc++.so.6.0.29 /usr/lib64/libstdc++.so.6
查看新链接库:strings /usr/lib64/libstdc++.so.6 | grep CXXABI
如果最新版本有变化,那么恭喜你,说明已经升级成功啦。
由于之前是用rpm包安装的cuda,有些文件是缺失的,运行时会报各种奇奇怪怪的错误,这里就不赘述了(只有经历过才会懂),直接介绍用二进制文件安装cuda过程。
下载地址:
http://developer.nvidia.com/cuda-11-7-0-download-archive?target_os=Linux&target_arch=x86_64&Distribution=CentOS&target_version=7&target_type=runfile_local
注意这里要选择runfile(local)。
然后执行sh
cuda_11.7.0_515.43.04_linux.run。
安装完成后,需要配置环境变量,在本地.bash_profile中配置如下两项:
下面验证一下安装是否成功,执行nvcc -V,如下图所示,那么恭喜你,安装成功啦。
安装cudnn和nccl需要先在nvidia注册账号,注册之后可以在以下两个地址下载相应的rpm包,然后rpm -ivh XXXXX.rpm包即可。
cudnn下载地址: http://developer.nvidia.com/cudnn
nccl下载地址: http://developer.nvidia.com/nccl/nccl-legacy-downloads
安装完成后,如下图所示说明已经安装成功rpm包。
又到激动人心的时刻啦,让我们来测试一下看看模型的推理效果如何?首先我们先擦拭一下还没有干透辛勤的汗水,一切努力,都是为了最终能跟机器人程序对上话,理想情况是让我们感觉它并不是一个机器人。
在终端执行如下命令,然后输入问题即可。
python -m fastchat.serve.cli --model-path ./model/vicuna-7b-all-v1.1 --style rich
当然,还可以根据不同的需求场景,设置不用的运行参数,如下:
python -m fastchat.serve.cli --model-path ./model/vicuna-7b-all-v1.1 --load-8bit --style rich
python -m fastchat.serve.cli --model-path ./model/vicuna-7b-all-v1.1 --device cpu --style rich
python -m fastchat.serve.cli --model-path ./model/vicuna-7b-all-v1.1 --num-gpus 3 --style rich
1)推荐菜谱测试:
2)多语言测试:
3)代码能力测试:
4)数学计算测试
5)普通对话推荐
推理过程中GPU服务器资源使用情况,目前使用单GPU进行推理,都可以做到秒级响应,GPU内存空加载13G,推理时不到15G,推理时单GPU算力基本可以达到90%以上,甚至100%,如下图所示。
总结一下:
1)对精确的推理效果并不是很理想,比如推荐菜谱,感觉是在一本正经的胡说八道,按照推理的结果很难做出可口的饭菜️;
2)对多种自然语言的支持,这个真的是出乎预料,竟然日语和西班牙语完全都能够自如应对,可以说是相当的惊艳了;
3)编码能力还是可以的,能够大概给出基本需求,当然如果想直接编译执行可能还需要人工微调,但是作为辅助工具应该是没问题的;
4)数据计算能力目前看还是比较弱的,简单的乘法目前还不能够给出正确的答案;
5)普通的对话是完全没有问题的,对中文的理解也完全能否符合预期,解解闷排解一下孤独是能够cover住的。
由于模型目前还没有做fine-tuning,从目前的推理效果来看,已经是非常不错了,而且推理的效率也是非常不错的,即使使用单GPU进行推理也可以做到秒级响应,而且推理过程中显存占用也才只有60%多,跟空载时候的50%多没差多少,总之在没有经过fine-tuning的情况下,模型的推理表现和推理效率还是可以打7-8分(满分10分)的,如果假以时日,有足够的语料库和进行fine-tuning的话,效果还是可期的。
要想使模型适合某一特定领域内的场景,获取特定领域的知识是必不可少的,基于原始模型就要做fine-tuning操作,那么我们尝试做一下fine-tuning,看看效果如何吧。
fine-tuning需要在终端执行一下命令:
torchrun --nproc_per_node=3 --master_port=40001 ./FastChat/fastchat/train/train_mem.py \
--model_name_or_path ./model/llama-7b-hf \
--data_path dummy.json \
--bf16 False \
--output_dir ./model/vicuna-dummy \
--num_train_epochs 2 \
--per_device_train_batch_size 1 \
--per_device_eval_batch_size 1 \
--gradient_accumulation_steps 8 \
--evaluation_strategy "no" \
--save_strategy "steps" \
--save_steps 300 \
--save_total_limit 10 \
--learning_rate 2e-5 \
--weight_decay 0. \
--warmup_ratio 0.03 \
--lr_scheduler_type "cosine" \
--logging_steps 1 \
--report_to "tensorboard" \
--fsdp "full_shard auto_wrap" \
--fsdp_transformer_layer_cls_to_wrap 'LlamaDecoderLayer' \
--tf32 False \
--model_max_length 2048 \
--gradient_checkpointing True \
--lazy_preprocess True
最终./model/vicuna-dummy目录输出就是我们fine-tuning之后的模型权重文件目录。
很遗憾,本文fine-tuning没有成功,报错如下:
原因也很简单,由于我们使用的GPU型号是Tesla P40,此款显卡使用的SM_62架构,目前模型fine-tuning至少需要SM_75及以上架构,看社区有在4090、A100或者A80显卡上fine-tuning成功的,所以fine-tuning只能后续再更高架构的显卡上进行了。
终上,Vicuna模型在整体表现和推理效率上可以说是秒杀Alpaca模型的,我们本文测试用的是Vicuna-7b,如果是Vicuna-13b效果会更好,而且对多种自然语言(包含中文)的支持也要远远好于Alpaca模型,确实像社区所说的,目前Vicuna模型可以说是开源大模型的天花板了,如果想基于开源大模型进行二次开发,是个不二的选择。
基于大模型的本地化部署工作目前就告一段落了,后续做的工作可能有以下几点:
1)如果有更好的显卡,可以对vicuna进行fine-tuinig,验证一下fine-tuning之后模型能不能学到特定领域的知识;后续准备使用公司内部提供的试用资源【京东云GPU云主机p.n3a100系列】,这个产品提供Nvidia® A100 GPU(80G显存),搭配使用Intel® Xeon® Platinum 8338C 处理器及DDR4内存,支持NVLink,单精度浮点运算峰值能达到156TFlops,可以说是最强算力了。
2)找到合适的与目前应用结合的场景,将大语言模型应用落地;
3)基于vicuna开源项目进行二次开发,封装成可用的服务;
4)基于大语言模型进行更多的探索和学习。
来源:京东云开发者社区
作者:Beyond_luo(未经授权请勿转载)
这是一篇有故事的文章---来自一个weex在生产环境中相爱相杀的小码农故事一:Build虽然weex的口号是一次撰写,多端运行,但其实build环节是有差异的,native端构建需要使用weex-loader,而web端则是使用vue-loader,除此以外还有不少差异点,所以webpack需要两套配置。最佳实践使用webpack生成两套bundle,一套是基于vue-router的webspa,另一套是native端的多入口的bundlejs首先假设我们在src/views下开发了一堆页面:buildweb配置web端的入口文件有 render.jsmain.jsApp.vuewebpack.prod.conf.js入口 buildnative配置native端的打包流程其实就是将src/views下的每个.vue文件导出为一个个单独的vue实例,写一个node脚本即可以实现。webpack.build.conf.js中生成并打包多入口:最终效果: 故事二:使用预处理器在vue单文件中,我们可以通过在vue-loader中配置预处理器,代码如下:而weex在native环境下其实将c
今天这个案例相对比较简单,算是对基本原理的一个加强理解吧。客户提供了一份其他公司做的优化报告,其中有个SQL确实是完成了优化,优化的结果也不错,但是给出的优化理由却是不准确的。下面是报告对该SQL进行分析优化的描述:SQL代码如下:SELECTCOUNT(1)FROMCB_PROBLEMALEFTOUTERJOINCB_PROJECTBONA.PRJ_SEQ=B.PRJ_SEQLEFTOUTERJOINBS_LINECONA.PRB_LINE=C.LINE_SEQLEFTOUTERJOINBP_FLOWDONA.PRB_FLOW=D.FLOW_SEQLEFTOUTERJOINBP_NODEEONA.PRB_NODE=E.NODE_SEQLEFTOUTERJOINBS_EFFECTFONA.EFFECT_LVL=F.VALUE_SEQLEFTOUTERJOINBS_FREQUENCYGONA.FREQUENCY_LVL=G.VALUE_SEQLEFTOUTERJOINBS_SEVERITYHONA.SEVERITY_LVL=H.VALUE_SEQWHEREA.STATUS!=0ANDA.
谷歌浏览器存储密码的方式在使用谷歌浏览器时,如果我们输入某个网站的账号密码,他会自动问我们是否要保存密码,以便下次登录的时候自动填写账号和密码在设置中可以找到登录账户和密码也可以直接看密码,不过需要凭证这其实是windows的DPAPI机制DPAPIDataProtectionApplicationProgrammingInterface(数据保护API)DPAPI是Windows系统级对数据进行加解密的一种接口无需自实现加解密代码微软已经提供了经过验证的高质量加解密算法提供了用户态的接口对密钥的推导存储数据加解密实现透明并提供较高的安全保证DPAPI提供了两个用户态接口`CryptProtectData`加密数据`CryptUnprotectData`解密数据加密后的数据由应用程序负责安全存储应用无需解析加密后的数据格式。但是加密后的数据存储需要一定的机制因为该数据可以被其他任何进程用来解密当然`CryptProtectData`也提供了用户输入额外`数据`来参与对用户数据进行加密的参数但依然无法放于暴力破解。微软提供了两个接口用来加密和解密,`CryptProtectMemory`
代理类型正向/反向代理区别正向代理:简单理解,服务端不知道客户端是谁,客户端全部请求都是通过代理发送给服务端。反向代理:客户端不知道服务端是谁,代理充当中转中心的角色,一般用户负载均衡。负载均衡,nginx做转发一般都属于反向代理。nginx反向代理 官网介绍:https://docs.nginx.com/nginx/admin-guide/web-server/reverse-proxy/HTTP请求转发访问http://8.210.146.22:8765/实际指向https://www.google.com.hk访问http://8.210.146.22:8764/实际指向https://www.instagram.comusernginx; worker_processesauto; error_log/var/log/nginx/error.log; pid/run/nginx.pid; #Loaddynamicmodules.See/usr/share/doc/nginx/README.dynamic. include/usr/share/nginx/modules/*.c
前言:众所周知,cpu,内存,磁盘是一个服务非常重要的三个核心资源,本章将介绍SQLServer内部的内存结构和内存管理。最后给出内存在腾讯云SQLServer云数据库监控指标中的反应,帮助用户了解SQLServer云数据库的特性。1.SQLServer数据库与NUMANUMA(非一致性内存架构)是为了扩展主板性能。在多个CPU服务器上,为了避免共享内存总线成为瓶颈,NUMA为每个CPU都单独设置了内存控制器。SQLServer的基础架构就是基于NUMA设计的。如果您之前了解过SQLServer内核任务调用部分,那您一定不会对node,scheduler,等名字有一定了解。当SQLServer实例启动时,将根据检测到的NUMA创建对应的node节点,然后再根据检测到的node中逻辑处理器的个数创建对应的scheduler。SELECT*FROMsys.dm_os_nodes;复制查看SQLServer启动后node的节点个数。SELECT*FROMsys.dm_os_scheduler;复制查看SQLServer启动后scheduler的个数,以及和node之间的关系。2.SQLSer
译者:王强 阅读本文需要3分钟尤雨溪在今年年初Vue3正式发布之前撰写了这篇长文,详述Vue3的设计过程。前端之巅将全文翻译如下,希望能帮助你更好地了解Vue3背后的故事。在过去的一年中,Vue团队一直都在开发Vue.js的下一个主要版本,我们希望能在今年上半年发布它(本文完成时这项工作尚在进行)。Vue新版本的理念成型于2018年末,当时Vue2的代码库已经有两岁半了。比起通用软件的生命周期来这好像也没那么久,但在这段时期,前端世界已经今昔非比了。在我们更新(和重写)Vue的主要版本时,主要考虑两点因素:首先是新的JavaScript语言特性在主流浏览器中的受支持水平;其次是当前代码库中随时间推移而逐渐暴露出来的一些设计和架构问题。为什么重写利用新的语言特性随着ES2015标准的落地,JavaScript(以前被称为ECMAScript,缩写为ES)获得了诸多重大改进,同时主流浏览器也终于开始对这些新特性提供良好的支持了。其中的一些特性使我们能够大幅提升Vue的能力。这里面最值得一提的就是Proxy,它为框架提供了拦截针对对象的操作的能力。Vue的一项核心特性就是监听用户定义状态的变
前段时间的主要工作是开发统计系统,统计公司产品的安装量和回访量,统计数据则由客户端调用C接口写入mysql数据库,即我们只需要分析客户端写入的原始数据即可。下面是对这个项目的一个总结:系统评估1、预估当前每天的回访量有大几百万,随着其它产品的不断推广,要统计的数据可能越来越多。2、统计的数据有比较强的约束关系。对于一条安装数据,必须判断之前唯一安装表中是否存在该记录,若存在则再根据版本判断升级或重装,否则为新装数据,回访数据类似逻辑。所以,如果要出按小时统计数据,则必须把前一个小时数据处理完之后才可以处理后面的数据;前一天的数据处理完之后才可以处理后一天的数据。3、团队中都擅长的是PHP。hadoop或其他大数据处理方式经验薄弱,面临学习成本和一些未知因素。所以最终还是选择用PHP+Mysql来统计,前期应该可以撑一撑。接下来对每个步骤进行梳理:1、C接口直接写数据到安装表和回访表,原始数据的表采用按年分表,按天分区。原始数据量比较大,也不适合PHP写入。2、转移数据。原始表记录数比较多,为了尽可能的减少与原始表的耦合,这里做了一个转移的动作,将原始表的最新安装、回访数据转移到近期安装
「图像分类」是人工智能领域的一个热门话题,我们在实际生活中甚至业务的生产环境里,也经常遇到图像分类相似的需求,如何能快速搭建一个图像分类或者内容识别的API呢?我们考虑使用ServerlessFramework将图像识别模块部署到腾讯云云函数SCF上。这里我们会用到一个图像相关的库:ImageAI,官方给了一个简单的demo:fromimageai.PredictionimportImagePrediction importos execution_path=os.getcwd() prediction=ImagePrediction() prediction.setModelTypeAsResNet() prediction.setModelPath(os.path.join(execution_path,"resnet50_weights_tf_dim_ordering_tf_kernels.h5")) prediction.loadModel() predictions,probabilities=prediction.predictImage(os.pa
抛出疑问❓通过配置中心,应用可以实时的接收到配置的变更,但是,应用中一些Bean是通过Spring容器来管理的,配置变更之后,怎么来修改Spring容器中对应Bean的状态呢?举个例子:如果在运行时修改了JDBC的参数配置,此时是重启应用呢?还是修改对应DataSourceBean的属性呢?如果是修改Bean的属性,直接修改有用吗?要怎么做呢?本文将以运行时修改JDBC参数为例,来讨论尝试运行时修改配置,最后提出普遍的解决方案。画外音:思路比结果更重要。难点分析???难点一:动态修改JDBC参数,假设修改的是URL和password,那旧连接使用的还是旧的配置,这个时候怎么办呢?旧连接立刻失效还是一段时间后在失效?在使用旧连接的线程要怎么处理呢?在动态切换的过程中,必然会有一个过渡过程,从旧连接过渡到新连接,这个过渡的过程应该是尽可能的平滑。比如可以通过运维层面来做到:在就修改完URL和password之后,还是会有一段时间可以支持旧的连接的正常访问,以保证程序的平稳过渡。难点二:DataSourceBean到底在哪里被引用了?能不能替换干净?旧连接如何放弃使用,并关闭?在修改完JD
版权声明:本文为博主原创文章,未经博主允许不得转载。https://blog.csdn.net/u014688145/article/details/69388673二分查找应用题目来源于leetcode:https://leetcode.com/tag/binary-search/IDTitleAcceptanceDifficulty35SearchInsertPosition39.3%Easy367ValidPerfectSquare37.8%Easy153FindMinimuminRotatedSortedArray39.2%Medium154FindMinimuminRotatedSortedArrayII36.6%Hard35.SearchInsertPosition详见连接:https://leetcode.com/problems/search-insert-position/#/descriptionpublicintsearchInsert(int[]nums,inttarget){ intlf=0,rt=nums.length-1; while(lf<rt
2019-05-14,终于自己也经历一次服务器被挖矿的事件。之前,听道友们讲Linux服务器被入侵、被挂马等等,当时感觉很不可思议,怎么会轻轻松松被入侵呢?安全防护得多low!(不过,这次并未打脸,被入侵的是大数据的机器,不归运维管理)情景是这样的,早上上班老大告诉我说手机收到告警,提示有xxx疑似挖矿程序入侵了xxx和xxx机器。马上进入状态,查看对应服务器信息,竟然是大数据那边的,坑人的是通过运维的中控机不能ssh。赶紧联系大数据负责人,授权中控机root访问权限。登陆机器,根据以往经验,开始排查:查看服务器负载,如果被挖矿负载应该很高才对:不出所料,负载已经跑满。赶紧看一下到底是哪个进程,使用top查看到一个名为donatexxx的进程占用CPU最高。第一时间找大数据人员进行核对,确定就是这个进程!干掉?No!并没有立马将其杀死,而是查看进程信息:查看一下上面的ip地址,来自芬兰!让大数据同事在所有大数据机器上执行netstat-anp|grep'95.216.44.240'确认其他机器没被入侵,然后才对这个进程做了处理。清理定时任务;清理进程启动文件kill
注意:1、用Ajax请求获取后台数据2、Echarts只能处理Json数据后台Controller:根据业务需求不同而返回不同数据,我前台要循环遍历Echarts的series进行数据添加,所以后台返了个二维数组过去。前端JSP页面:为Echarts准备一个具有高宽的dom容器前端JS:初始化时即加载Echarts,将不需要进行加载的配置项(例如title、tooltip等)不作改动,将需要动态加载数据的配置放入ajax的success:function(){}中进行处理。定义一个为series这个即将动态加入数据的配置项准备的名为Item的数组容器,接着对后台返回过来的数据(childkind)进行遍历,将遍历出的数据赋给容器中的相应属性(例:tp.name=childkind[i])。由于series里面的data属性(接收的是数组数据)也需要进行数据动态加载,接着再定义一个list数组,循环写入数据到list中,再将list数组返给tp.data。最后再设置Echarst相关配置项。
本文作者:IMWebmoonye原文出处:IMWeb社区未经同意,禁止转载 创建一个chrome的插件,并让这个插件能够作为一个app,运行在终端设备上。<!--more-->创建一个chrome插件该插件app实现一个搜索框,输入内容后,根据输入内容去github搜索名称有关联的repositories 书写manifest.json创建chromeapp的加载页面书写加载页面的内容使用chrome的扩展程序加载程序代码manifest.json chrome的app的配置文件有固定的形式,简单配置如下{"manifest_version":2,//固定为2"name":"chromeextensionsearch",//名称自定义"version":"1.0","app":{"background":{"scripts":["scripts/main.js"]//app的入口文件}},&quo
大家好,又见面了,我是你们的朋友全栈君。查看文件或目录的权限:ll更改权限操作:chmod ①.u表示:属主。 ②.g表示:所属组用户。 ③.o表示:其他用户。 ④.a表示:所有用户。 ⑤.+表示:增加权限。 ⑥.-表示:删除权限。 ⑦.=表示:分配权限。1.每一行显示一个文件或目录的信息,这些信息包括文件的类型、文件的权限、文件的属主、文件的所属组、文件大小、创建时间和文件名。 2.读取权限:r,写入权限:w,执行权限:x。 ①---:没有权限,对应二进制为000,八进制为0. ②--x:允许执行,对应二进制001,八进制为1. ③-w-:允许写入,对应二进制位010,八进制为2. ④r--:允许读取,对应二进制为100,八进制为4. ⑤属主,组用户,其他用户。 3.-代表一般文件,d代表目录,l代表软链接文件。版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至举报,一经查实,本站将立刻删除。发布者:全栈程序员栈长,转载请注明出处:https://javafo
什么是分布式架构下的高可用设计避免单点故障 a)负载均衡技术(failover/选址/硬件负载/ 软件负载/去中心化的软件负载(gossip(redis- cluster))) b)热备(linuxHA) c)多机房(同城灾备、异地灾备)应用的高可用性 a)故障监控(系统监控(cpu、内存)/链路监控/日志监 控)自动预警 b)应用的容错设计、(服务降级、限流)自我保护能力 c)数据量(数据分片、读写分离)分布式架构下的可伸缩设计垂直伸缩提升硬件能力 水平伸缩增加服务器加速静态内容访问速度的CDNCDN是ContentDeliveryNetwork的缩写,表示的是内容分发网络。CDN的作用是把用户需要的内容分发到离用户最近的地方,这样可以是用户能够快熟获取所需要的内容。CDN其实就是一种网络缓存技术,能够把一些相对稳定的资源放到距离最终用户较近的地方,一方面可以节省整个广域网的贷款消耗,另外一方面可以提升用户的访问速度,改进用户体验。我们一般会把静态的文件(图片、脚本、静态页面)放到CDN中 当用户点击网站页面上的内容URL,经过本地DNS系统解析,DNS 系统会最终将域名的解析权交给
1.接口描述接口请求域名:dcdb.tencentcloudapi.com。 本接口(ModifyDBInstanceSecurityGroups)用于修改云数据库安全组 默认接口请求频率限制:20次/秒。 APIExplorer提供了在线调用、签名验证、SDK代码生成和快速检索接口等能力。您可查看每次调用的请求内容和返回结果以及自动生成SDK调用示例。 2.输入参数以下请求参数列表仅列出了接口请求参数和部分公共参数,完整公共参数列表见公共请求参数。 参数名称 必选 类型 描述 Action 是 String 公共参数,本接口取值:ModifyDBInstanceSecurityGroups。 Version 是 String 公共参数,本接口取值:2018-04-11。 Region 是 String 公共参数,详见产品支持的地域列表。 Product 是 String 数据库引擎名称,本接口取值:dcdb。 InstanceId 是 String 实例ID。 SecurityGroupIds.N 是 ArrayofString 要
总括来说,客户端从发送一个HTTP请求到Flask处理请求,分别经过了web服务器层,WSGI层,web框架层,这三个层次。 不同的层次其作用也不同,下面简要介绍各层的作用。 图1:web服务器,web框架与WSGI的三层关系 Web服务器层 对于传统的客户端-服务器架构,其请求的处理过程是,客户端向服务器发送请求,服务器接收请求并处理请求,然后给客户端返回响应。在这个过程中,服务器的作用是: 接收请求 处理请求 返回响应 Web服务器是一类特殊的服务器,其作用是主要是接收HTTP请求并返回响应。提起web服务器大家都不会陌生,常见的web服务器有Nginx,Apache,IIS等。在上图1的三层结构中,web服务器是最先接收用户请求的,并将响应结果返回给用户。 Web框架层 Web框架的作用主要是方便我们开发web应用程序,HTTP请求的动态数据就是由web框架层来提供的。常见的web框架有Flask,Django等,我们以Flask框架为例子,展示web框架的作用: fromflaskimportFlask app=Flask(__name__) @app.route('/h
一:如果zabbix监控大量主机,比如超过500台左右的主机,就可能会出现延迟比较大的问题,比如数据采集慢,队列等待较多等,查看队列的方法如下: 1.1:Administration-Queue: 1.2:主动模式与被动模式: 这是对于zabbixagent来说的工作模式 #被动模式就是由zabbixserver向zabbixagent发出指令获取数据,即zabbixagent被动的去获取数据并返回给zabbixserver,这也是默认的工作方式。 #主动模式是有zabbixagent主动采集数据并返回给zabbixserver,不再需要zabbixserve进行干预,因此主动模式在一定程度上可减轻zabbixserver的压力。复制 1.3:将被动模式改为主动模式: PidFile=/var/run/zabbix/zabbix_agentd.pid LogFile=/var/log/zabbix/zabbix_agentd.log LogFileSize=0 StartAgents=0#不监听被动模式端口10051 ServerActive=192.1
1.要在constructor-super里接收context对象 2.给组件(class/purefunction)指定contextType属性,用来接收store对象 以下代码模拟了connect(类似react-redux里connect的功能)高阶组件的实现: functionconnect(mapStateToProps=doNothing,mapDispatchToProps=doNothing){ returnfunction(WrappedComponent){ classHOCextendsReact.Component{ constructor(props,context){ super(props,context); } render(){ conststore=this.context.store; conststateProps=mapStateToProps(store.getState());//deliverstate constdispatchProps=mapDispatchToProps(store.dispatch);//deliverdi
作业链接 课程第六次作业统计完成,本次作业满分100分,统计结果如下: |学号|姓名|作业地址|分数 |---|---|---|---|---|--- |111500206|赵畅|http://www.cnblogs.com/ZCplayground/p/6918979.html|85 |031602211|盖嘉轩|http://www.cnblogs.com/gjx031602211/p/6925988.html|75 |031602131|佘岳昕|http://www.cnblogs.com/ctsyx/p/6926115.html|85 |031602209|陈志炜|http://www.cnblogs.com/darkexisted/p/6926104.html|75 |031602438|叶一帆|http://www.cnblogs.com/yyf031602438/p/6920721.html|85 |031602248|郑智文|http://www.cnblogs.com/Zzwena/p/6925889.html|73 |031602128|林志华|http://www