【腾讯云 HAI域探秘】使用高性能应用服务HAI快速开发一款赛博朋克风拼图游戏,化繁从简,低成本进入人工智能时代。

news2024/11/15 21:58:45

前言

        人工智能(AI)是当今科技领域的热门话题,尤其是自然语言处理(NLP)技术,它可以让机器理解和生成自然语言。随着大型语言模型(LLM)的发展,如 GPT-3、DALL-E 等,我们可以利用这些模型来完成各种有趣和有用的任务,如写诗、画画、编程等。但是,要让这些模型按照我们的意愿工作,并不是一件容易的事情。

        当你还在错误使用 AI 工具如 GPT,可能会觉得其作用不过是知识平移总结或简单问答。实际上,当了解正确的用法,你会发现:AI 不是来替代你的,是来帮助你更好工作。如果还用搜索引擎的“关键词匹配”、“关键词命中”思路去思考人工智能的使用,已然有些落后。

        本篇通过详细介绍使用腾讯云高性能应用服务 HAI ,部署StableDiffusion和ChatGLM2-6B 模型来帮助我开发【赛博朋克风拼图】游戏,为你分享AI的正确打开方式。 游戏的图片素材基于StableDiffusion画图生成。游戏的开发思路基于 ChatGLM2-6B 生成,部分代码也基于AI生成。降低了学习成本,提高了开发效率,1个小时就搞定,先给大家看看效果:

拼图一共分5关,分别是3*3,4*4等,难度逐级增加,所用图片的均是500px*500px大小。接下来我就给大家详细介绍我是如何使用腾讯云高性能应用服务HAI来帮助我开发这个赛博朋克风拼图游戏的。

 一、腾讯云高性能应用服务HAI

1、HAI是什么

        腾讯云高性能应用服务(Hyper Application Inventor, HAI) , 是一款腾讯云面向Al、科学计算的GPU应用服务产品,是为开发者量身打造的澎湃算力平台。无需复杂配置,便可享受即开即用的GPU云服务体验。

        目前正处于新品内测阶段,早用早享受,可以点击 申请资格  审核通过后即可使用。兄弟们审核时间大概1-2个工作日,如果着急的话可以找妹子聊会儿天。

2、为什么选择HAI

        目前的AI模型在部署场景上存在环境配置复杂,部署难度大。模型效果调试难,无可视化界面。模型、资源配置流程繁琐,难以快捷保存等痛点,而HAI的一键部署特性可以在短短几分钟内构建AI框架或模型。

        新品内侧阶段HAI可以体验的一键部署应用

        AI框架:Pytorch2.0.0、Tensorflow2.9.0

        AI模型:Stable Diffusion、Llama2 7B、Llama2 13B、ChatGLM2 6B

        大幅降低GPU云服务器使用门槛,多角度优化产品使用体验,开箱即用

        基于AI应用自动匹配合适的套餐避免不匹配风险,不用了解GPU型号、不需要自己部署驱动和环境依赖、不用自己进行繁琐的资源配置、不用具备一定的运维知识,大大节约了学习和部署的时间,进而达到了降本增效的目的。

二、HAI一键部署StableDiffusion

1、申请高性能应用服务HAI

(1) 点击链接进入 高性能应用服务 HAI 申请体验资格

  

(2)等待审核通过后,进入 高性能应用服务 HAI   

(3) 点击前往体验HAI,登录 高性能应用服务 HAI 控制台

(4)点击 新建 选择 AI模型,参照下图进行配置

(5) 等待创建完成

(6)创建完成,查看相关状态

(7) 查看详细的配置信息

2、StableDiffusion模型搭建

(1)进入 StableDiffusionWebUI ,以下可选择两种方式进入

或者从服务器详情页进入

(2)StableDiffusionWebUI操作界面简介


StableDiffusion就部署完成了(默认界面是英文版的,兄弟们有需要可以下载汉化插件,把界面汉化一下),接下来就可以在StableDiffusionWebUI界面来生成游戏开发所需要的素材了
 

3、使用SD设计游戏素材

        赛博朋克风拼图一共就设计了5个关卡,所以需要借助HAI一键部署的StableDiffusion来生成5张自己喜欢的赛博朋克风图片素材。

        StableDiffusion简称SD,是目前比较火的一个AI人工智能绘制工具。SD拥有开源绘图AI算法模型,结合多种插件,配合海量的开源模型库,可根据喂图和文字指令,精准实现可商用的AI绘图效果。

        注意:提示词(Prompt)越多,AI 绘图结果会更加精准。另外,目前中文提示词的效果不好,还得使用英文提示词。

这是我使用SD的参数配置,我个人还是比较满意这个出图效果的,要是一次生成不满意的可以多生成几张,直到满意为止。我发现腾讯的HAI服务器的性能好就算了,可视化数据真的爱了。

10秒左右一张图,一共出了20多张图我就挑选了自己最喜欢的5张,如下:

三、HAI一键部署ChatGLM2-6B

 1、新建AI模型

    进入HAI 控制台,点击新建,选择AI模型ChatGLM2-6B,地域可以随意选择一个,然后算力方案选择进阶型的算力方案,如果显示售罄的话也可以购买基础型的算力方案(0.88元/小时)。
 

        需要注意的是如果使用的是进阶型的算力方案的话按照我的步骤不会报错,但是如果使用的是基础型的算力方案就会报torch.cuda.OutOfMemoryError,请您在开始实验前输入以下关闭 webui 功能的命令,提高服务器的性能,以便后续实验能快速正常进行:

sudo fuser -k 6889/tcp #执行这条命令将关闭 HAI提供的 chatglm2_gradio webui功能

这个错误其实就是GPU内存不足,最简单的解决办法就是使用更大的GPU或者释放不必要的GPU内存。

等待3-8分钟创建完成后

点击算力连接,选择Gradio进入webui页面

基于腾讯云HAI一键部署ChatGLM2-6B成功之后可以和自己的GPT打个招呼,效果如下

接下来就是让GPT给兄弟们排忧解难了,帮助大家更快更清晰,更省时省力去开发拼图游戏。

2、技术知识总结

        大家想开发一个项目,前期如果没有清晰的技术知识储备是无从下手的。现在的手册非常丰富。需要接触的信息太多、排版五花八门,看起来云里雾里。这时候就可以借助 GPT 的总结能力,例如我想学习一下vue自定义组件的相关知识,让它帮我总结。

可以看到,它很好地总结了vue自定义组件的相关知识,并且对每一个关键点进行了概括。用最少的语言让你能够搞懂你想要的知识点。是不是再也不用浪费时间去找网上那些杂七杂八还不靠谱的文档了?

3、需求拆解

        那么在工作当中,AI 如何帮助我们提效?我们从需求端获取一个需求以后,很多情况下我们的任务并不能够非常准确的估计时,原因就是我们并没有将任务拆分清楚,所以并不能够对每一项任务进行估计,导致风险的发生。

        这时候可以简要描述一下我们这次的需求点,让 GPT 帮我们进行任务拆解。我这个赛博朋克风拼图游戏仅供参考,给大家说这个的目的主要还是希望大家可以正确使用AI。

        可以看到任务整体被拆成了一个个细小的任务。它可以很快的让我们将任务转换为 task,或者是需求跟踪单。这既方便和产品经理进行沟通,也便于我们自身排期。如果仍有疑问,可以继续询问拆解。

四、游戏代码开发

1、云端IDE

Cloud Studio(云端 IDE)

        腾讯云云端开发环境 Cloud Studio 是基于浏览器的集成式开发环境(Integrated Development Environment,IDE),为开发者提供了一个稳定的云端工作站。用户在使用 Cloud Studio 时无需安装,随时随地打开浏览器就能使用。其功能包含代码高亮、自动补全、Git 集成、终端等 IDE 的基础功能,同时支持实时调试、插件扩展等,可以帮助开发者快速完成各种应用的开发、编译与部署工作。

全功能

无需下载安装,随时随地开发编码,拥有媲美本地 IDE 的流畅编码体验。

多环境

内置 Node.js、Java、Python 等常见环境,也可以连接到云服务器进行资源管理。

在线预览

在线预览快速生成预览链接,方便分享他人展示项目或在线调试。

兼容 VS Code 插件

默认的配置无法满足需求,可以在线安装 VS Code 插件来增强使用体验。

持久化和快速加载

随开随写,随时保存,再也无需担心断电未保存,不浪费您的每一份灵感。

2、一键部署开发环境

直接在腾讯云的搜索栏里面搜索Cloud Studio 选择云端IDE之后点击立即使用即可

先选择空间模板之后点击框架模板,然后选择vue.js即可一键部署

3、项目代码开发

(1)将SD生成图片素材集成到项目的资源目录

(2)根据GPT拆解的任务去开发项目

核心源码

模板部分(template),主要是元素的布局,本例采用v-for动态加载,如下所示:

<template>
  <div class="puzzle" :style="{width:width+'px',height:height+'px'}">
    <div
      v-for="(item,index) in blockPoints"
      :key="item.id"
      :style="{width:blockWidth+'px',
        height:blockHeight+'px',
        left:item.x+'px',top:item.y+'px',
        backgroundImage:`url(${img})`,
        backgroundPosition:`-${correctPoints[index].x}px -${correctPoints[index].y}px`,
        opacity: index===blockPoints.length-1 && 0 }"
      v-on:click="handleClick"
      class="puzzle__block"
      :ref="index===blockPoints.length-1?'empty':'block'"
      :data-correctX="correctPoints[index].x"
      :data-correctY="correctPoints[index].y"
    ></div>
  </div>
</template>

脚本部分(Script),主要用于逻辑的校验和判断,如下所示:

<script>
export default {
  props: {
    img: {
      // 图片路径
      type: String,
      required: true,
    },
    width: {
      // 图片总宽度
      type: Number,
      default: 500,
    },
    height: {
      // 图片总高度
      type: Number,
      default: 500,
    },
    row: {
      // 行数
      type: Number,
      default: 3,
    },
    col: {
      // 列数
      type: Number,
      default: 3,
    },
  },
  data() {
    return {
      status: {
        type: String,
        default: "进行中......",
      },
    };
  },
  methods: {
    handleClick(e) {
      const blockDom = e.target;
      const empthDom = this.$refs.empty[0];
      const { left, top } = blockDom.style;
      if (!this.isAdjacent(blockDom, empthDom)) {
        return;
      }
      //交换元素
      blockDom.style.left = empthDom.style.left;
      blockDom.style.top = empthDom.style.top;
      empthDom.style.left = left;
      empthDom.style.top = top;
      const winFlag = this.winCheck();
      if (winFlag) {
        //   console.log('success');
        this.winGame(empthDom);
      }
    },
    isAdjacent(blockDom, empthDom) {
      // 判断是否相邻
      const { left: blockLeft, top: blockTop, width, height } = blockDom.style;
      const { left: emptyLeft, top: emptyTop } = empthDom.style;
      const xDis = Math.floor(
        Math.abs(parseFloat(blockLeft) - parseFloat(emptyLeft))
      );
      const yDis = Math.floor(
        Math.abs(parseFloat(blockTop) - parseFloat(emptyTop))
      );
      const flag =
        (blockLeft === emptyLeft && yDis === parseInt(height)) ||
        (blockTop === emptyTop && xDis === parseInt(width));
      console.log(flag);
      return flag;
    },
    winCheck() {
      // 判断是否完成
      const blockDomArr = this.$refs.block;
      return blockDomArr.every((dom) => {
        const { left: domLeft, top: domTop } = dom.style;
        const { correctx: correctX, correcty: correctY } = dom.dataset;
        const flag =
          parseInt(domLeft) === parseInt(correctX) &&
          parseInt(domTop) === parseInt(correctY);
        return flag;
      });
      // console.log(blockDomArr.length);
    },
    winGame(empthDom) {
      //通关
      setTimeout(() => {
        this.status = "胜利";
        alert("恭喜通关");
        empthDom.style.opacity = 1;
        this.$emit("getStatus");
        setTimeout(() => {
          this.goToNextLevel();
        }, 300);
      }, 300);
    },
    goToNextLevel() {
      const answerFlag = window.confirm("现在进行下一关么?");
      if (answerFlag) {
        this.status = "进行中......";
        this.$emit("next");
      }
    },
  },
  computed: {
    blockWidth() {
      return this.width / this.col;
    },
    blockHeight() {
      return this.height / this.row;
    },
    correctPoints() {
      const { row, col, blockWidth, blockHeight } = this;
      const arr = [];
      for (let i = 0; i < row; i++) {
        for (let j = 0; j < col; j++) {
          arr.push({
            x: j * blockWidth,
            y: i * blockHeight,
            id: new Date().getTime() + Math.random() * 100,
          });
        }
      }
      return arr;
    },
    blockPoints() {
      const points = this.correctPoints;
      const length = points.length; //数组的长度
      const lastEle = points[length - 1]; //最后一个元素
      const newArr = [...points];
      newArr.length = length - 1;
      //打乱顺序
      newArr.sort(() => Math.random() - 0.5);
      newArr.push(lastEle);
      return newArr;
    },
  },
};
</script>

样式部分(Style),主要用于外观样式的设置,如下所示:

<style>
.puzzle {
  box-sizing: content-box;
  border: 2px solid #cccccc;
  position: relative;
}
.puzzle__block {
  border: 1px solid #ffffff;
  box-sizing: border-box;
  /* background-color: rebeccapurple; */
  position: absolute;
  transition: all 0.3s;
}
</style>

组件的调用,如下所示:

<template>
  <div>
    <h3>[拼图游戏]当前是第{{level+1}}关,当前状态[{{status}}]</h3>
    <puzzle ref="dpuzzle" @getStatus="getStatus" @next="handleNext" v-bind="puzzleConfig[level]" />
  </div>
</template>

注意事项:

如果获取组件内部的元素的值,在组件调用时采用ref属性,然后获取组件内的data属性值。

组件内如果调用父组件的方法,本文采用触发注册事件的方式this.$emit("next")

(3)开发完成后查看最终实现效果

使用腾讯云高性能应用服务HAI快速开发的一款"赛博朋克风拼图"游戏,已经全部完成,大家如果需要完整的源代码参考学习可以找我。

五、常见问题

1、HAI服务器计费问题,销毁之后扣款会延后扣,就导致我明明都销毁了后续才慢慢计费。

希望后续可以在我销毁后就立马结算。

2、新建服务器时如果切换页面了,返回来之后实例就消失了得重新创建实例。

六、总结

         几乎对于所有入门计算机课程的人来说, “hello world” 就是大家最开始使用计算机语言与机器沟通的第一句话,不过随着 AI 的发展和普及,大家都可以直接用最简单最自然的话语让 AI 告诉你怎么让机器来执行和输出 “hello world” 。

所以我开发这款赛博朋克风拼图游戏是希望帮助大家更好地欣赏赛博朋克风,体验未来的反乌托邦精神。最主要的目的还是希望大家可以做到与时俱进,快速融入人工智能时代。在使用HAI的过程中,我感受到了它作为一款面向AI和科学计算的GPU应用服务产品所带来的种种优势。

首先,HAI可以根据应用匹配推选GPU算力资源,实现最高性价比。这使得我们在进行AI模型训练和复杂科学计算时,可以更加灵活地选择适合的计算资源,不仅可以提高计算效率,还可以大大节约成本。

其次,HAI提供了一键部署功能,可以在分钟级自动构建LLM、AI作画等应用环境。更为重要的是,它还提供了多种预装模型环境,包括热门模型StableDiffusion和ChatGLM2等,这大大减少了我们进行应用构建和调试的时间和精力,让开发者可以更加专注于模型的设计和优化。此外,HAI提供了友好的图形界面,也就是可视化界面,使得AI调试更为简单和直观。这使得我们可以更加直观地观察模型的输出和优化结果,快速检测和解决问题,提高工作效率,减少出错概率。

总而言之,感谢腾讯云HAl为我们进行AI模型训练和复杂科学计算提供了极大的便利和支持,使得我们可以更加专注于创新和研究,快速迭代和优化模型,实现更好的效果。后续希望大家和我一起探索腾讯云HAl更多的功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1271185.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于SSM医院住院管理系统

摘 要 随着时代的发展&#xff0c;医疗设备愈来愈完善&#xff0c;医院也变成人们生活中必不可少的场所。如今&#xff0c;已经2021年了&#xff0c;虽然医院的数量和设备愈加完善&#xff0c;但是老龄人口也越来越多。在如此大的人口压力下&#xff0c;医院住院就变成了一个问…

引领Serverless构建之路,亚马逊云科技re:Invent 2023首日主题演讲重磅发布

在每年的亚马逊云科技re:lnvent大会&#xff0c;由Peter DeSantis带来的《周一晚间直播》是re:lnvent大会的第一个并让人值得期待的主题演讲。作为亚马逊云科技高级副总裁&#xff0c;Peter发布了数据库和应用领域的三项Serverless创新&#xff0c;使客户能够更快、更轻松地扩展…

RT_Thread_msh_系统msh命令、使用msh时过滤ulog日志、添加msh命令(不带/带参)

1、msh配置 msh功能是自动开启的&#xff0c;配置如下&#xff0c;可以在“RT-Thread Settings”里去修改。 调试过程中遇到msh不能使用&#xff0c;理解msh也是一个线程&#xff0c;有自己的优先级20&#xff0c;高优先级的线程&#xff08;比如main是10&#xff09;如果一直…

自定义 element DatePicker组件指令 使选择器呈现为只读状态,用户无法直接编辑,但可以查看和选择日期

1.问题 现实中遇到列表的搜索条件使用DatePicker 组件进行开始结束时间筛选&#xff0c;但是手动修改input中的值&#xff0c;导致请求参数异常。比如讲clearable设置为false之后还是能手动清空输入框中的值。虽然组件提供了readonly 属性&#xff0c;但是也会让日期选择也无法…

java学习part22包装类

119-面向对象(高级)-包装类的理解_基本数据类型与包装类间的转换_哔哩哔哩_bilibili 1.包装类 2.基本转包装方式 2.1new方式 源码 2.2valueof&#xff08;&#xff09; 3.包装转基本 4.基本类型和包装类型的默认值不一样 比如boolean默认false Boolean默认null&#xff08;对…

电子学会 2023年9月 青少年软件编程Python编程等级考试二级真题解析(选择题+判断题+编程题)

青少年编程Python编程等级考试二级真题解析(选择题+判断题+编程题) 2023年9月 一、选择题(共25题,共50分) 以下代码运行结果是?( ) A. 宸宸 B. 杭杭 C. 玉玉 D. 州州 答案选:A 考点分析:考察python 列表操作 jxw=yyh[2][0],jxw的值是“拱宸桥”,jxw[1]的值是“宸”…

QT QGraphicsItem 图元覆盖导致鼠标点击事件不能传递到被覆盖图元

一、概述 在日常开发中&#xff0c;遇到这样一个问题&#xff0c;线图元和引脚图元重叠&#xff0c;导致点击引脚图元&#xff0c;没有进入引脚图元的鼠标点击事件中。 二、产生原因 如果您的 QGraphicsItem 上有一个图元覆盖了它&#xff0c;可能会导致鼠标事件无法正常触发…

软件设计之原型模式

原型模式是从一个对象再创建另一个可定制的对象&#xff0c;而且不需要知道任何创建的细节。拷贝分浅拷贝和深拷贝。浅拷贝无法拷贝引用对象。在面试的时候&#xff0c;我们会投多家公司&#xff0c;根据岗位的不同我们会适当调整。使用原型模式可以快速达到需求&#xff0c;下…

抖音直播招聘报白如何提高求职者体验?

为了提升抖音直播招聘报白中求职者的体验&#xff0c;以下是一些建议&#xff1a; 提供清晰的招聘流程和信息。在直播招聘开始之前&#xff0c;企业或人力资源公司应提供清晰的流程和信息&#xff0c;包括直播时间和直播平台&#xff0c; 职位信息&#xff0c;招聘要求等&…

ubuntu系统安装及常用软件安装

Ubuntu 22.04 安装及常用软件安装 在日常开发中&#xff0c;习惯了 ubuntu 系统上安装开发工具及一些指令执行的效率较高&#xff0c;且一些编译环境在 windows 下不是很友好&#xff0c;又因为经常折腾会将 ubuntu 系统的文件系统搞坏而需要重新安装&#xff0c;因此本文整理…

智能监控平台/视频共享融合系统EasyCVR接入RTSP协议视频流无法播放原因是什么?

视频集中存储/云存储/视频监控管理平台EasyCVR能在复杂的网络环境中&#xff0c;将分散的各类视频资源进行统一汇聚、整合、集中管理&#xff0c;实现视频资源的鉴权管理、按需调阅、全网分发、智能分析等。AI智能/大数据视频分析EasyCVR平台已经广泛应用在工地、工厂、园区、楼…

25. 深度学习进阶 - 权重初始化,梯度消失和梯度爆炸

文章目录 权重初始化梯度消失与梯度爆炸 Hi&#xff0c;你好。我是茶桁。 咱们这节课会讲到权重初始化、梯度消失和梯度爆炸。咱们先来看看权重初始化的内容。 权重初始化 机器学习在我们使用的过程中的初始值非常的重要。就比如最简单的wxb&#xff0c;现在要拟合成一个yha…

进阶C语言-字符函数和字符串函数

字符函数和字符串函数 &#x1f388;1.函数介绍&#x1f50e;1.1strlen函数&#x1f52d;1.1.1strlen函数的模拟实现&#x1f4d6;1.计数器法&#x1f4d6;2.递归法&#x1f4d6;3.指针-指针 &#x1f50e;1.2strcpy函数&#x1f52d;1.2.1strcpy函数的模拟实现 &#x1f50e;1…

npm上传发布自定义组件超详细流程

前言 vue3&#xff0c;vite&#xff0c;基于element Plus 的el-table二次封装表格并且上传到npm上&#xff0c;让别人可以通过npm安装你的插件。 一、创建一个新的vue 项目 npm create vuelatest 自己取一个名字&#xff0c;然后一直回车 完成以后进入项目npm i,有用到eleme…

VMware虚拟机安装和使用教程(附最新安装包+以ubuntu为例子讲解)

目录 一、VMware Workstation 17 Pro 简介 二、新功能与改进 三、安装教程 3.1、下载安装包 3.2、运行安装包 四、创建虚拟机 五、启动虚拟机 六、总结与展望 一、VMware Workstation 17 Pro 简介 VMware Workstation 17 Pro是VMware公司为专业用户打造的一款虚拟化软件…

网络视频怎么更改IP?使用静态IP更改地址有哪些好处?

随着互联网的普及&#xff0c;越来越多的人开始使用网络视频。有时候&#xff0c;我们可能会遇到需要更改网络视频的IP地址的情况。那么&#xff0c;如何更改IP地址呢&#xff1f;使用静态IP更改地址又有哪些好处呢&#xff1f; 首先&#xff0c;我们来了解一下什么是静态IP地址…

如何利用树莓派与Nginx结合内网穿透服务实现远程访问内部站点——“cpolar内网穿透”

文章目录 1. Nginx安装2. 安装cpolar3.配置域名访问Nginx4. 固定域名访问5. 配置静态站点 安装 Nginx&#xff08;发音为“engine-x”&#xff09;可以将您的树莓派变成一个强大的 Web 服务器&#xff0c;可以用于托管网站或 Web 应用程序。相比其他 Web 服务器&#xff0c;Ngi…

时间、空间复杂度

1、概念 时间复杂度 时间复杂度是指算法执行所需的时间&#xff0c;通常用算法执行的操作次数来表示。时间复杂度通常用大 O 表示法来表示&#xff0c;其中 O 表示算法的渐近时间复杂度。例如&#xff0c;O(n)表示算法的执行时间与输入规模 n 成正比&#xff0c;O(n^2)表示…

Java基础之常用类

Java基础之常用类 一、包装类1.1、Java基本数据类型及其对应的包装类1.2、包装类的自动装箱、自动拆箱机制1.3、包装类的优点 二、String类三、StringBuffer类和StringBuilder类3.1、主要区别&#xff1a;3.2、StringBuffer/StringBuilder用法(两者用法一致) 四、日期类4.1、Da…

单点登录平台设计

1.基本介绍 1.1什么是单点登录 单点登录&#xff08;Single Sign-On&#xff0c;简称SSO&#xff09;是一种身份认证的解决方案&#xff0c;它允许用户只需一次登录即可访问多个应用程序或系统。在一个典型的SSO系统中&#xff0c;用户只需通过一次身份认证&#xff0c;就可以…