ChatGPT一周年:开源语言大模型的冲击
自2022年末发布后,ChatGPT给人工智能的研究和商业领域带来了巨大变革。通过有监督微调和人类反馈的强化学习,模型可以回答人类问题,并在广泛的任务范围内遵循指令。在获得这一成功之后,人们对LLM的兴趣不断增加,新的LLM在学术界和工业界不断涌现,其中包括许多专注于LLM的初创公司。
尽管闭源LLM(如OpenAI的GPT、Anthropic的Claude)通常优于其对应的开源模型,但后者的进展十分迅速,并且声称在某些任务上取得了与ChatGPT相当甚至更好的表现。这不仅深刻影响了语言大模型的研究,同时还具有非凡的商业价值。在ChatGPT发布一周年之际,本文旨在提供开源LLM这一成功的全面综述,并全面调研了开源LLM声称已达到或超过ChatGPT水平的任务。
注:本文最新版本更新至12月5日,暂未收录近期发布的首个开源MoE大模型Mixtral(8x7B),据称已达到甚至超越了LLaMA2(70B)和GPT-3.5的水平。(以下内容由OneFlow编译发布,转载请联系授权。原文:https://arxiv.org/pdf/2311.16989.pdf)
作者 | Hailin Chen、Fangkai Jiao等
OneFlow编译
翻译|宛子琳、杨婷
1
引言
一年前,OpenAI发布了ChatGPT,它迅速横扫了人工智能社区和整个世界。这是第一款基于应用的人工智能聊天机器人,它能够就大多数问题提供有用、安全且详细的答案,并能遵循指令,甚至能承认并改正之前的错误。值得注意的是,它似乎能够出色地完成自然语言任务,而这些任务通常是由经过预训练,然后进行定制微调的语言模型(如摘要或问答)完成的。
作为该领域的首创之作,ChatGPT得到了广泛关注——在推出后两个月内就吸引了1亿用户,比TikTok或YouTube等其他热门应用的增长快得多。[1] 由于ChatGPT能够降低劳动成本、自动化工作流程,甚至还能为客户带来全新体验(Cheng等,2023年),所以还吸引了巨额投资。
然而,ChatGPT并未开源,而是由由私人公司掌控,因此大部分技术细节仍处于未知状态。尽管OpenAI声称其遵循了InstructGPT(也称为GPT-3.5)中所介绍的程序(Ouyang等,2022b),但其确切架构、预训练数据和微调数据均未可知。这种闭源特性导致了几个关键问题。
第一,由于不了解预训练和微调程序等的内部细节,特别是在已知LLM惯于生成有害、不道德、不真实内容的情况下,我们很难准确评估ChatGPT对社会存在的潜在风险。第二,已有报道称,ChatGPT的性能会随时间发生变化,这妨碍了复现结果(Chen等,2023)。第三,ChatGPT已多次发生故障,仅在2023年11月就发生过两次重大故障,期间ChatGPT网站及其API访问被完全阻断。第四,采用ChatGPT的企业可能会担忧调用API的成本过于高昂、服务中断、数据所有权、隐私等问题以及其他突发事件,比如最近发生的CEO Sam Altman被解雇、员工逼宫董事会以及Sam最终重返公司董事会的戏剧性事件。
另一方面,开源语言大模型潜在弥补或规避了前面所述的大部分问题,因此它们提供了一个充满希望的方向。基于这一原因,研究界一直在积极推动在开源环境下维护高性能LLM。然而,截至2023年末,人们普遍认为LLaMa-2(Touvron等,2023年)或Falcon(Almazrouei等,2023年)等开源LLM落后于对应的闭源模型,比如OpenAI的GPT3.5(ChatGPT)和GPT-4(OpenAI, 2023b),Anthropic的Claude 2或Google的Bard 3,其中GPT-4通常被认为是最优秀的闭源模型。然而令人振奋的是,开源和闭源模型之间的差距正逐渐缩小,开源LLM正迅速追赶。
图1:不同LLM在各种通用基准上的总览。
实际上,正如图1所示,最优秀的开源LLM已经在某些标准基准上取得了优于GPT-3.5-turbo的表现。然而,对于开源LLM来说,这并不是一场简单挑战。局势依旧在不断演变:闭源LLM定期在更新的数据上重新训练以进行更新,开源LLM也不甘落后,不断发布着新版本。目前,LLM的评估数据集和基准繁杂多样,因此难以评选出最优秀的LLM。
本文旨在整合最近有关开源LLM的研究,并概述它们在各个领域与ChatGPT相匹敌甚至超越的情况。我们的贡献主要包括以下三方面:
• 整合了对开源LLM的各种评估,提供了比较开源LLM与ChatGPT的公正而全面的视角(见图1,第3.1节)。
• 系统地调研了在各种任务中匹敌或超越ChatGPT性能的开源LLM,并进行了相应分析(见图2,第3节,第4.2节)。同时,我们还在维护一个用于追踪最新模型更新的实时网页。[4]
• 分析开源LLM的发展趋势(第4.1节),训练开源LLM的优秀实践(第4.3节)以及开源LLM可能存在的问题(第4.4节)。
谁能从这份报告中受益?本研究旨在帮助学界和业界了解开源LLM的当前格局和未来潜力。对于研究人员,本文提供了对开源LLM当前进展和不断变化趋势的详尽综述,指出了未来研究有前景的方向。对于商业领域,本调查提供了宝贵的见解和指导,能帮助决策者评估采用开源LLM的适用性和好处。
接下来,我们将首先介绍背景概念(第2节),然后对各个领域中击败ChatGPT的开源LLM进行深入探究(第3节),随后讨论关于开源LLM的见解和问题(第4节),最后进行总结(第5节)。
2
背景
本节将简述与LLM相关的基本概念。
2.1 训练模式
预训练:所有LLM都依赖于在互联网文本数据上进行的大规模自监督预训练(Radford等,2018;Brown等,2020)。仅解码器LLM(Decoder-only LLM)遵循因果语言建模目标,即模型学习在先前词元序列的条件下预测下一个词元(Bengio等,2000)。根据开源LLM分享的预训练细节(Touvron等,2023a),文本数据来源包括CommonCrawl5、C4(Raffel等,2020)、GitHub、Wikipedia、书籍,以及Reddit或StackOverFlow等在线讨论交流内容。众所周知,扩大预训练语料库的规模可以提高模型性能,并与扩大模型规模相辅相成,这一现象被称为规模定律(scaling law),在(Hoffmann等,2022a)中对此进行了深入分析。如今LLM的预训练语料库规模可达数千亿到数万亿词元(Touvron等,2023b;Penedo等,2023)。
微调[8]:目标是使经预训练的LLM适应下游任务,通过使用现有的监督信息来更新权重,通常这些信息组成的数据集比用于预训练的数据集要小数个数量级(Devlin等,2018)。T5(Raffel等,2020)是最早将微调纳入文本到文本统一框架中的模型之一,其中每个任务由自然语言指令描述。
指令微调:后来通过在多个任务上进行训练来扩展微调范围(Wei等,2021a;Aribandi等,2021),其中每个任务都用自然语言指令描述。由于指导微调能够显著提高LLM的零样本性能(包括在训练期间未见过的新任务上的表现),因此迅速受到了欢迎。
标准的指令微调与多任务监督微调(通常称为SFT)可能仍无法产生符合人类意图、安全、道德且无害的模型,并且可以通过人类反馈的强化学习(RLHF)进一步改进(Ouyang等,2022b):人类标注员对微调模型的输出打分,然后再次使用强化学习对模型进行微调(Ouyang等,2022b)。最近的研究表明,人类反馈可以由LLM的反馈替代,这一过程称为从AI反馈中强化学习(RLAIF)(Bai等,2022b)。直接偏好优化(DPO)绕过了RLHF中需要将奖励模型拟合到人类偏好的需求,直接使用交叉熵目标对策略进行微调,从而更有效地使LLM与人类偏好对齐。
部分研究在构建多任务指令微调数据集时,注重质量而非数量:Lima(Zhou等,2023a)仅利用1000个示例对Llama-65B进行微调,结果超越了GPT-3,而Alpagasus(Chen等,2023c)通过清洗其指令微调数据集,将示例数量从52000减少到9000,从而改进了Alpaca(Taori等,2023)的性能。
持续预训练:指的是使用通常比第一阶段更少的数据量,对经过预训练的语言大模型(LLM)进行又一轮预训练。这一过程可用于快速适应新领域或引出LLM的新特性。例如,在Lemur(Xu等,2023d)中使用持续预训练来改进编码和推理能力,在Llama-2-long(Xiong等,2023)中用于扩展上下文窗口。
推理:有几种方法可替代使用LLM进行自回归解码的序列生成,这些方法在输出的随机性和多样性程度上存在差异。在采样过程中增加温度参数(temperature)可以使输出更加多样化,而将温度设为0则回归到贪婪解码(greedy decoding),当需要确定性输出时可能是必要的。采样方法top-k (Fan等,2018)和top-p (Holtzman等,2019) 在每个解码步骤中限定了可供采样的词元池。
有几种技术用于提高推理速度,尤其是在较长的序列长度下,由于注意力复杂度随输入长度呈二次增长而变得棘手。FlashAttention (Dao等,2022) 通过优化GPU内存层级之间的读/写操作,加速了训练和推理。FlashDecoding (Dao等,2023) 并行加载注意力机制中的键-值(KV)缓存,使端到端速度提高至8倍。推测性解码(Speculative decoding ) (Leviathan等,2023;Chen等,2023b) 使用额外的小型语言模型来近似从LLM中获得下一个词元的分布,从而在加速解码的同时保持性能。vLLM (Kwon等,2023) 利用PagedAttention算法(一种优化注意力键和值内存使用的算法)加速LLM推理和服务。
2.2 任务领域及评估
由于需要进行多样化和广泛的评估,因此对LLM的能力进行恰当评估仍是一个活跃的研究领域。问答数据集(Joshi等,2017;Kwiatkowski等,2019;Lin等,2022)是非常流行的评估基准,但最近也出现了专为LLM评估量身定制的新基准(Dubois等,2023;Beeching等,2023;Zheng等,2023)。
3
开源LLM vs. ChatGPT
在章节中,我们将探索LLM在六个主要领域的能力:泛化能力、代理能力、逻辑推理(包括数学和编码能力)、长文本建模、特定应用(如问答或摘要)以及可信度。限于内容篇幅,感兴趣的读者可详细阅读原论文第3节内容(https://arxiv.org/pdf/2311.16989.pdf),本部分重要结论在第4节中已经给出。
4
讨论
4.1 LLM的发展趋势
自Brown等人(2020年)展示了GPT-3模型在各种任务上能取得惊人的零样本和少样本性能后,人们开始将大量精力投入到语言大模型(LLM)的开发和推进上。其中一项研究方向集中在扩大模型参数规模上,包括Gopher(Rae等人,2021年),GLaM(Du等人,2022年),LaMDA(Thoppilan等人,2022年),MT-NLG(Smith等人,2022年)和PaLM(Chowdhery等人,2022年),最终模型规模达到了5400亿参数。尽管这些模型展现出了卓越的能力,但由于是闭源模型,这限制了它们的广泛应用,因此人们逐渐对开源LLM的开发越来越感兴趣(Zhang等人,2022年;Workshop等人,2022年)。
与扩大模型规模不同,另一条研究路线探索了更好的策略或目标以预训练较小的模型如Chinchilla(Hoffmann等人,2022年b)和UL2(Tay等人,2022年)。在预训练之外,人们还致力于研究语言模型的指令微调,如FLAN(Wei等人,2021b)、T0(Sanh等人,2021)和Flan-T5(Chung等人,2022)等。
一年前,OpenAI推出的ChatGPT极大地改变了自然语言处理(NLP)社区的研究重点(Qin等人,2023a)。为了迎头赶上OpenAI,Google和Anthropic分别推出了Bard和Claude。尽管在许多任务中,它们的性能都能与ChatGPT媲美,但与最新的OpenAI模型GPT-4(OpenAI,2023b)之间仍然存在性能差距。由于这些模型的成功主要来自于人类反馈的强化学习(RLHF)(Schulman等人,2017b;Ouyang等人,2022a),所以研究人员探索了各种RLHF的改进方法(Yuan等人,2023;Rafailov等人,2023b;Lee等人,2023b)。
为推动开源语言大模型的研究,Meta发布了LLaMA系列模型(Touvron等人,2023a,b)。自此以后,基于LLaMA的开源模型迅速涌现。其中一个代表性的研究方向是利用指令数据对LLaMA进行微调,包括Alpaca(Taori等人,2023)、Vicuna(Chiang等,2023)、Lima(Zhou等,2023b)和WizardLM(Xu等,2023a)。当前的研究还探索了改进基于LLaMA的开源LLM的智能体(Xu等,2023d;Zeng等人,2023;Patil等,2023;Qin等,2023b)、逻辑推理(Roziere等,2023;Luo等人,2023a,c)和长上下文建模(Tworkowski等,2023;Xiong等,2023;Xu等,2023b)能力。此外,与其基于LLaMA开发LLM,许多工作致力于从头开始训练强大的LLM,例如MPT(Team,2023)、Falcon(Almazrouei等,2023)、XGen(Nijkamp等,2023)、Phi(Gunasekar等,2023;Li等,2023e)、Baichuan(Yang等,2023a)、Mistral(Jiang等,2023a)、Grok(xAI,2023)和Yi(01ai,2023)。我们相信,开发更强大、更高效的开源LLM,以实现闭源LLM能力的普及化,是一个很有发展前景的未来研究方向。
4.2 总结
就综合能力而言,Llama-2-chat-70B(Touvron等人,2023b)在某些基准测试中的表现优于GPT-3.5-turbo,但在大多数其他任务中的表现仍然落后。通过蒸馏直接偏好优化,Zephir-7B(Tunstall等人,2023)趋近于70B LLM的性能。WizardLM-70B(Xu等人,2023a)和GodziLLa-70B(Philippines,2023)能够实现与GPT-3.5-turbo相当的性能,表明这是一个有发展前景的研究方向。
在一些领域中,开源LLM的性能超越了GPT-3.5-turbo。对于基于LLM的智能体,通过更广泛和特定于任务的预训练和微调,开源LLM能够在一些任务上超越GPT-3.5-turbo。例如,Lemur-70B-chat(Xu等人,2023d)在探索环境和遵循编码任务反馈方面的表现更好。AgentTuning(Zeng等人,2023)在未知智能体任务上取得了提升。
ToolLLama(Qin等人,2023b)能够更好地使用工具。Gorilla(Patil等人,2023)相比GPT-4更擅长编写API调用。
在逻辑推理方面,WizardCoder(Luo等人,2023c)和WizardMath(Luo等人,2023a)通过增强的指令微调提高了推理能力。Lemur(Xu等人,2023d)和Phi(Gunasekar等人,2023;Li等人,2023e)通过在更高质量的数据上预训练,取得了更强的能力。
对于建模长上下文,Llama-2-long(Xiong等人,2023)使用了更长的词元和更大的上下文窗口进行预训练,从而在选定的基准测试中提升了性能。Xu等人(2023b)通过将上下文窗口扩展与位置插值和检索增强相结合,提高了7个长上下文任务的性能。对于特定应用能力,InstructRetro(Wang等人,2023a)通过使用检索和指令微调进行预训练,在开放式问答方面取得了性能提升。通过特定于任务的微调,MentaLlama-chat-13B(Yang等人,2023c)在心理健康分析数据集上超过了GPT-3.5-turbo的性能表现。Radiology-Llama2(Liu等人,2023)能够提高放射学报告的性能。Stru-Bench(Tang等人,2023b)是一个经过微调的7B模型,相对于GPT-3.5-turbo,它能够改善结构化响应生成,这是支持智能体任务的核心能力。Shepherd(Wang等人,2023c)只有7B参数,能够在生成模型反馈和评价方面取得与GPT-3.5-turbo相当或更好的性能。对于可信赖的人工智能,可以通过使用更高质量的微调数据来减少幻觉(Lee等人,2023a)、上下文感知解码技术(Dhuliawala等人,2023)、外部知识增强,如Li等人(2023c);Yu等人(2023b);Peng等人(2023);Feng等人(2023),或多代理对话(Cohen等人,2023;Du等人,2023)。
在人工智能安全等领域,GPT-3.5-turbo和GPT-4仍然是无法超越的存在。由于GPT模型涉及大规模的RLHF(Bai等人,2022a),人们普遍认为它们的行为更安全、更符合伦理。这对于商业LLM而言可能比开源LLM更重要。然而,随着RLHF过程的平民化(Bai等人,2022b;Rafailov等人,2023a),开源LLM在安全性方面将取得更多性能提升。
4.3 最佳开源LLM的秘诀
语言大模型的训练涉及复杂实践且需要大量资源,包括数据收集、预处理、模型设计以及训练。尽管开源LLM的发布日益增长,但不幸的是,领先模型的详细实践通常被保密。以下是一些广受社区认可的最佳实践。
数据:预训练涉及数万亿个来自公开可访问来源的数据词元的使用。从伦理角度来看,剔除所有包含私人信息的数据至关重要(Touvron等人,2023b)。与预训练数据不同,微调数据的数量较少,但质量更高。使用高质量数据进行微调的LLM已经在特定领域中表现出了更好的性能(Philippines,2023;Zeng等人,2023;Xu等人,2023d,a)。
模型架构:尽管大多数LLM使用的都是仅解码器的Transformer架构,但同时它们还使用了不同的技术来优化效率。Llama-2采用Ghost attention以改善多轮对话控制(Touvron等人,2023b)。Mistral(Jiang等人,2023b)使用滑动窗口注意力来处理扩展的上下文长度。
训练:使用指令微调数据进行监督微调(SFT)的过程至关重要。为获得高质量结果,需要数万个SFT注释,比如Llama-2使用了27540个注释(Touvron等人,2023b)。数据的多样性和质量至关重要(Xu等人,2023a)。在RLHF阶段,人们通常会首选近端策略优化(PPO)(Schulman等人,2017a)算法,以更好地对齐模型行为与人类偏好和指令,因此近端策略优化在增强LLM安全性方面起到了关键性作用。直接偏好优化(DPO)是PPO的替代方法(Rafailov等人,2023a)。例如,Zephyr-7B(Tunstall等人,2023)采用了蒸馏DPO,并在各种通用基准测试中显示出与70B-LLM相当的性能,甚至在AlpacaEval上超过了GPT-3.5-turbo。
4.4 漏洞和潜在问题
预训练期间的数据污染问题:这一问题变得越来越突出了,尤其是在没有公开预训练语料库来源的基础模型的发布后。这种透明度的缺乏可能使人们对语言大模型(LLM)真正的泛化能力产生偏见。除基准数据被人工专家或更大型的模型注释,并手动集成到训练集之外,数据污染问题的根本原因在于,基准数据的收集源已被包含在了预训练语料库之中。虽然这些模型并非有意使用监督数据进行预训练,但它们仍然可以获取确切知识。因此,解决LLM预训练语料库的检测问题(Shi等,2023),探索现有基准和广泛使用的预训练语料库之间的重叠,并评估基准测试的过拟合(Wei等,2023)十分关键,这对于提高LLM的忠诚度和可靠性至关重要。展望未来,以后的方向可能涉及建立公开预训练语料库细节的标准化实践,并开发在整个模型开发生命周期中减轻数据污染的方法。
闭源的对齐开发:在社区内,使用通用偏好数据用于对齐的RLHF应用受到了越来越多关注。然而,由于高质量、公开可用的偏好数据集和预训练奖励模型的稀缺性,只有少数开源LLM应用了RLHF,增强了对齐。人们提出了一些倡议(Bai等人,2022a;Wu等人,2023;Cui等人,2023)试图为开源社区做贡献。然而,在复杂的推理、编程和安全场景中,我们仍面临着缺乏多样性、高质量和可扩展的偏好数据的挑战。
持续提升模型基本能力的困难:本文所概述的基本能力突破揭示了一些有挑战性的问题:(1) 在预训练期间,已经投入了大量努力来探索改进的数据组合,以提高构建更强大的基础模型的平衡性和鲁棒性。然而,这种尝试的相关成本较高,在实际应用中不太现实。(2) 性能上超越GPT-3.5-turbo或GPT-4的模型,主要利用了从闭源模型进行的知识蒸馏和额外的专家注释。这种方法虽然高效,但对知识蒸馏的过度依赖可能会掩盖将这些方法扩展到教师模型时可能出现的问题。
此外,人们期望LLM能够充当智能体并提供合理的解释以支持决策,然而,为使LLM适用于现实世界情景,对智能体式数据进行标注同样昂贵且耗时。实质上,仅通过知识蒸馏或专家标注进行优化无法持续改进LLM的基本能力,而且很可能接近上限。未来的研究方向可能涉及探索新的方法论,如无监督或自监督学习范式,以在缓解相关挑战和成本的同时,实现基本LLM能力的持续进步。
5
总结
在这篇报告中,我们系统审查了ChatGPT发布一年后,在各种任务中超越或迎头赶上ChatGPT的高性能开源LLM(第3节)。此外,我们对开源语言大模型进行了深入洞察和分析,并探讨了潜在问题(第4节)。我们相信,这份调查有助于探索开源LLM的未来发展方向,并将激发该领域的进一步研究和发展,能帮助缩小开源模型和闭源模型之间的差距。
DeepCache 和 OneDiff 将 SDXL 迭代速度提高 3 倍
近期,DeepCache为加速扩散模型提供了一种新的免训练、几乎无损的范式。现在,OneDiff 引入了一个名为 ModuleDeepCacheSpeedup的新ComfyUI Node(已编译的DeepCache模块), 让SDXL在RTX 3090上的迭代速度提升3.5倍,在A100上提升3倍。
示例:https://github.com/Oneflow-Inc/onediff/pull/426
使用指南:https://github.com/Oneflow-Inc/onediff/tree/main/onediff_comfy_nodes#installation-guide
其他人都在看
-
语言大模型的推理技巧
-
LoRA微调语言大模型的实用技巧
-
ChatGPT规模化服务的经验与教训
-
机器学习硬件十年:性能变迁与趋势
-
开源语言大模型演进史:向LLaMA 2看齐
-
语言大模型的分布式训练与高效微调指南
-
迈向百倍加速:全栈Transformer推理优化
试用OneFlow: github.com/Oneflow-Inc/oneflow/http://github.com/Oneflow-Inc/oneflow/
相关文章:
ChatGPT一周年:开源语言大模型的冲击
自2022年末发布后,ChatGPT给人工智能的研究和商业领域带来了巨大变革。通过有监督微调和人类反馈的强化学习,模型可以回答人类问题,并在广泛的任务范围内遵循指令。在获得这一成功之后,人们对LLM的兴趣不断增加,新的LL…...
C++ Qt开发:Charts绘图组件概述
Qt 是一个跨平台C图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍QCharts二维绘图组件的常用方法及灵活运用。 …...
基于Java+SpringBoot实现人脸识别搜索
基于JavaSpringBoot实现人脸识别搜索 引言 背景介绍 结合人脸识别技术,在工厂、学校、商场、餐厅等人流密集的场所进行监控,对人流进行自动统计、识别和追踪,同时标记存在安全隐患的行为及区域,并发出告警提醒,加强…...
【论文阅读】FreeU: Free Lunch in Diffusion U-Net
FreeU: 无需训练直接提升扩散模型生成效果。 paper:https://arxiv.org/abs/2309.11497 code:GitHub - ChenyangSi/FreeU: FreeU: Free Lunch in Diffusion U-Net 1. 介绍 贡献: •研究并揭示了U-Net架构在扩散模型中去噪的潜力࿰…...
TypeScript实战——ChatGPT前端自适应手机端,PC端
前言 「作者主页」:雪碧有白泡泡 「个人网站」:雪碧的个人网站 可以在线体验哦:体验地址 文章目录 前言引言先看效果PC端手机端 实现原理解释 包的架构目录 引言 ChatGPT是由OpenAI开发的一种基于语言模型的对话系统。它是GPT(…...
自定义ORM(mybatis)源码(六)-类型处理器
自定义ORM(mybatis)源码(六)-类型处理器 模仿mybatis 用于处理 sql 设置参数类型和 执行 sql 后响应字段的类型处理 TypeHandler public interface TypeHandler<T> {/*** sql 设置参数值* param pstmt* param i* param value* throws SQLException*/void setParamete…...
Linux shell编程学习笔记37:readarray命令和mapfile命令
目录 0 前言1 readarray命令的格式和功能 1.1 命令格式1.2 命令功能1.3 注意事项2 命令应用实例 2.1 从标准输入读取数据时不指定数组名,则数据会保存到MAPFILE数组中2.2 从标准输入读取数据并存储到指定的数组2.3 使用 -O 选项指定起始下标2.4 用-n指定有效行数…...
GDB:强大的GNU调试器
GDB,全称为GNU Debugger,是一款广泛使用的源代码级调试工具。它支持多种编程语言,包括C、C、Fortran、Objective-C、Python、Ada和Go等。GDB能够帮助开发者在开发过程中定位和修复程序中的错误,通过设置断点、查看变量值、单步执行…...
综述 2022-Egyptian Informatics Journal:电子健康记录的安全和隐私
Keshta, Ismail, and Ammar Odeh. "Security and privacy of electronic health records: Concerns and challenges." Egyptian Informatics Journal 22.2 (2021): 177-183. https://doi.org/10.1016/j.eij.2020.07.003 被引次数:207 IF 5.2 / JCR Q2...
PHP数组定义和输出
数组就是一组数据的集合,把一系列数据组织起来,形成一个可操作的整体。 PHP中的数组与Java的数组不一样,需要有key(键)和value(值),相当于Java中数组和键值对的结合。 数组的定义 …...
MySQL中已经有了Binlog,为啥还要有Redo Log
参考文章 MySQL中的Binlog和Redo Log虽然都与事务的持久性和可恢复性有关,但它们服务于不同的目的和场景,并且在MySQL的架构中扮演着互补的角色。 Redo Log: 目的:Redo Log 主要用于保证InnoDB存储引擎的事务持久性。它确保在系…...
Java数据结构-模拟ArrayList集合思想,手写底层源码(1),底层数据结构是数组,编写add添加方法,正序打印和倒叙打印
package com.atguigu.structure; public class Demo02_arrayList {public static void main(String[] args) {MyGenericArrayListV1 arrayListV1 new MyGenericArrayListV1();//arr.add(element:100,index:1);下标越界,无法插入//初始化(第一次添加&…...
MyBatis-Plus如何 关闭SQL日志打印
前段时间公司的同事都过来问我,hua哥公司的项目出问题了,关闭不了打印sql日记,项目用宝塔自己部署的,磁盘满了才发现大量的打印sql日记,他们百度过都按照网上的配置修改过不起作用,而且在调试时候也及为不方…...
单元测试框架jUnit
JUnit(Java单元测试框架)是用于在Java应用程序中执行单元测试的框架。它是一个开源框架,广泛用于Java开发中。以下是一些关于JUnit的常见问题以及相应的汉语回答: 1. **什么是JUnit?** - JUnit是一个用于编写和运行…...
微软 Visual Studio 迎来 AI 建议命名功能
目录 1微软 Visual Studio 迎来 AI 建议命名功能 2专访核桃编程CEO曾鹏轩:实操是掌握编程技能的唯一办法 1微软 Visual Studio 迎来 AI 建议命名功能 IT之家 12 月 19 日消息,使用付费 GitHub Copilot Chat 扩展的 Visual Studio Preview 用户…...
【排序算法】C语言实现选择排序与冒泡排序
文章目录 🚀前言🚀冒泡排序✈️冒泡排序的逻辑✈️冒泡排序coding 🚀选择排序✈️选择排序的逻辑✈️选择排序coding 🚀前言 这里是阿辉算法与数据结构专栏的第一篇文章,咱们就从排序算法开始讲起,排序算法…...
设计模式之-原型模式,快速掌握原型模式,通俗易懂的理解原型模式以及使用场景
文章目录 一、什么是原型模式二、使用场景三、代码示例 一、什么是原型模式 原型模式是一种创建型设计模式,它允许通过复制现有对象来创建新的对象,而无需通过调用构造函数来创建。原型模式通过克隆操作来创建对象,提供了一种更加灵活和高效…...
数据结构之进阶二叉树(二叉搜索树和AVL树、红黑树的实现)超详细解析,附实操图和搜索二叉树的实现过程图
绪论 “生命有如铁砧,愈被敲打,愈能发出火花。——伽利略”;本章主要是数据结构 二叉树的进阶知识,若之前没学过二叉树建议看看这篇文章一篇掌握二叉树,本章的知识从浅到深的对搜索二叉树的使用进行了介绍和对其底层…...
SpringIOC之LocaleContext
博主介绍:✌全网粉丝5W+,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验✌ 博主作品:《Java项目案例》主要基于SpringBoot+MyBatis/MyBatis-plus+…...
前端案例—antdDesign的Select多选框组件加上全选功能
前端案例—antdDesign的Select多选框组件加上全选功能。 实现效果如下: Select 组件里有这个属性,可以利用这个对下拉菜单进行自定义。 const handleChange (e, value) > {setSelectState(e.target.checked)let arr productOptions?productOption…...
个人财务工具、密钥管理平台、在线会计软件、稍后阅读方案 | 开源专题 No.51
gethomepage/homepage Stars: 10.1k License: GPL-3.0 这个项目是一个现代化、完全静态的、快速且安全的应用程序仪表盘,具有超过 100 种服务和多语言翻译的集成。 快速:网站在构建时以静态方式生成,加载时间飞快。安全:所有对后…...
HBase基础知识(二):HBase集群部署、HBaseShell操作
1. HBase安装部署 1.1 Zookeeper正常部署 首先保证Zookeeper集群的正常部署,并启动之: 创建集群启动脚本: #!/bin/bash case $1 in "start"){ for i in hadoop100 hadoop101 hadoop102 do echo----------zookeeper $i 启动----…...
C 标准库 - <time.h>
简介 time.h 头文件定义了四个变量类型、两个宏和各种操作日期和时间的函数。 库变量 下面是头文件 time.h 中定义的变量类型: 序号变量 & 描述1size_t是无符号整数类型,它是 sizeof 关键字的结果。2clock_t这是一个适合存储处理器时间的类型。3…...
养老院自助饮水机(字符设备驱动)
目录 1、项目背景 2、驱动程序 2.1 三层架构 2.2 驱动三要素 2.3 字符设备驱动 2.3.1 驱动模块 2.3.2 应用层 3、设计实现 3.1 项目设计 3.2 项目实现 3.2.1 驱动模块代码 3.2.2 用户层代码 4、功能特性 5、技术分析 6. 总结与未来展望 1、项目背景 养老院的老人…...
Jenkins 构建触发器指南
目录 触发远程构建 (例如,使用脚本) 描述 配置步骤 安全令牌 在其他项目构建完成后触发构建 描述 配置步骤 定时触发构建 描述 配置步骤 GitHub钩子触发GITScm轮询 描述 配置步骤 Poll SCM - 轮询版本控制系统 描述 触发远程构建 (例如,使…...
通用的java中部分方式实现List<自定义对象>转为List<Map>
自定义类 /*** date 2023/12/19 11:20*/ public class Person {private String name;private String sex;public Person() {}public Person(String name, String sex) {this.name name;this.sex sex;}public String getName() {return name;}public String getSex() {return…...
Python---静态Web服务器-返回固定页面数据
1. 开发自己的静态Web服务器 实现步骤: 编写一个TCP服务端程序获取浏览器发送的http请求报文数据读取固定页面数据,把页面数据组装成HTTP响应报文数据发送给浏览器。HTTP响应报文数据发送完成以后,关闭服务于客户端的套接字。 2. 静态Web服务器-返回固…...
react v-18父组件调用子组件的方法和数据
版本 "react": "^18.1.0", "react-dom": "^18.1.0", 父组件 import React, { useState, useRef, memo, useEffect } from "react"; import { useTranslation } from "react-i18next"; import { Card } from &q…...
Linux——缓冲区
我在上篇博客留下了一个问题,那个问题就是关于缓冲区的问题,我们发现 文件有缓冲区,语言有用户级缓冲区,那么缓冲区到底是什么?,或者该怎 么认识缓冲区?这篇文章或许会让你有所认识,…...
Mac 生成Android签名证书 .keystore文件
工具下载地址 https://www.oracle.com/java/technologies/downloads/#jdk21-mac1. 找到安装jdk的路径,并进入bin目录下 1.1 查找JDK命令 /usr/libexec/java_home -v结果为: java_home: option requires an argument -- v /Library/Java/JavaVirtualMachines/jdk…...
html5写的网站有什么好处/小程序开发公司前十名
在一个表格中,假设有一栏数据非常多,如果在页面中完全显示该数据,则会导致表格非常难看,宽窄高低不一。 效果如下图: 很明显这是不美观的,非常影响用户体验。为了达到更好的效果,我们需要下面的…...
网站的二级目录是什么/汕头seo排名
1.安装依赖(内网环境 挂载光盘)本文链接原创: 我照着此文部署 yum -y install gcc gcc-c autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 gli…...
搬瓦工如何搭建做网站/营销软文代写
前提是你的电脑和手机都已经安装了frida并运行正常。 如果你还没安装frida,请参考文章 Android逆向_使用frida 安装frida环境。这里使用国外大佬写的js脚本,来追踪app的方法调用,首先看一下效果:*** entered com.test.flyer.MainActivity.tes…...
大学科技园网站建设/网络营销课程培训课程
在上面几篇文章中,我们介绍了Grafana的安装配置以及运行的方法,本篇文章我们就来介绍下Grafana的基本概念。一、Data Source — 数据源 Grafana支持多种不同的时序数据库数据源,Grafana对每种数据源提供不同的查询方法,而且能很好…...
网站建站无锡/网络优化工程师是干什么的
质数定义:质数(prime number)又称素数。质数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数。 示例解决方案1有很多方法可以解决这个问题,下面是一些例子:这是一个不同的功能分解来解决问题。 def get_numb…...
在农村开个网站要多少钱/企业关键词推广
为什么80%的码农都做不了架构师?>>> 方法一: 一般会更新操作都会判断null值,为null就不更新对应的字段。但是有时候需要把特定的字段更新为null,使用mybatis-plus时可以在实体类特定属性上面加注解TableField(strateg…...