谷歌发布开源多模态大模型 Gemma3 本地部署试用(教程) 仅17GB即可达到GPT的多模态水平 超过O3-mini | 多模态、文本生成、代码能力测试

Gemma3

Gemma 是 Google 基于用于创建 Gemini 模型的相同研究和技术构建的一系列轻量级、最先进的开放模型。Gemma 3 模型是多模态的,可以处理文本和图像输入并生成文本输出,预训练变体和指令微调变体均具有开放权重。Gemma 3 具有大型 128K 上下文窗口,支持 140 多种语言,并且提供比以前版本更多的尺寸选择。Gemma 3 模型非常适合各种文本生成和图像理解任务,包括问答、摘要和推理。由于其相对较小的尺寸,可以在资源有限的环境中部署,例如笔记本电脑、台式机或您自己的云基础设施,从而实现最先进的 AI 模型访问民主化,并帮助促进每个人的创新。
在这里插入图片描述

输入和输出

输入:
文本字符串,例如问题、提示或要摘要的文档
图像,归一化为 896 x 896 分辨率并编码为每个图像 256 个 token
4B、12B 和 27B 尺寸的总输入上下文为 128K token,1B 尺寸为 32K token
输出:
对输入生成的文本,例如对问题的回答、图像内容的分析或文档的摘要
总输出上下文为 8192 token

0.环境要求

需要先安装ollama和openwebui,可参考:https://blog.csdn.net/qq_26123545/article/details/145723607?spm=1001.2014.3001.5501
当然如果有其它推理框架(vllm\sglang\llama\xinference等)或webui(dify\anythingllm\ragflow等) 也可以

1.安装(Ollama)

这里默认安装满血版

ollama pull gemma3:27b

WebUI添加

然后再webui中添加此模型,并设置上下文长度8192,权限改为public

2.资源使用情况

部署环境在4090D卡上,输出token速度很快
在这里插入图片描述

3.多模态测试

我输入了几张图,测试情况很不错
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.文本生成测试

Prompt:
请完成一道高考作文题目:
长久以来,人们只能看到月球固定朝向地球的一面,“嫦娥四号”探月任务揭开了月背的神秘面纱;随着“天问一号”飞离地球,航天人的目光又投向遥远的深空……
正如人类的太空之旅,我们每个人也都在不断抵达未知之境。
这引发了你怎样的联想与思考?请写一篇文章。
要求:选准角度,确定立意,明确文体,自拟标题;不要套作,不得抄袭;不得泄露个人信息;不少于800字。

回答:
“嫦娥四号”揭开月背神秘面纱,“天问一号”飞向深空……这不仅仅是科技的进步,更是人类对未知永恒的追寻。正如人类的太空之旅,我们每个人的人生,亦是一场不断抵达未知之境的旅程。这旅程充满挑战,充满迷茫,但更蕴藏着无限可能,以及定义自我的机会。

孩提时代,我的世界被父母的臂弯和学校的围墙所限定。未知,是围墙外的世界,是课本之外的知识,是想象力无法企及的远方。那时,未知是恐惧的,是需要被保护的。我害怕黑暗,害怕独自面对陌生的环境,害怕失败和挫折。我渴望安稳,渴望被认可,渴望在已知领域里获得安全感。

然而,成长本身就是一场破茧之旅。小学升初中,初中升高中,每一次的跳跃,都意味着告别熟悉的舒适区,踏入未知的领域。我记得第一次离开父母独自参加夏令营,面对陌生的环境和同学,我感到无所适从,甚至想哭着回家。我害怕与人交流,害怕融入集体,害怕自己与别人格格不入。但最终,我鼓起勇气,主动与他人沟通,积极参与集体活动。我发现,原来未知并非可怕,它只是需要我们去探索,去尝试,去适应。

高中时代,我开始接触到更广阔的世界。文学、历史、哲学……这些学科打开了我的视野,让我了解到人类文明的辉煌与脆弱,了解到世界的复杂与多元。我开始思考人生的意义,思考社会的价值,思考如何成为一个对社会有用的人。然而,思考的过程往往伴随着迷茫和困惑。我不知道自己真正喜欢什么,不知道自己擅长什么,不知道自己未来的路该怎么走。

我曾经一度陷入迷茫,甚至怀疑自己的人生价值。我害怕选择错误,害怕付出努力却一无所获,害怕最终一事无成。我试图寻找捷径,试图模仿他人,试图找到一个现成的答案。但最终我发现,捷径是不存在的,模仿是肤浅的,答案只能由自己去寻找。

真正的成长,在于勇敢地面对未知,在于不断地探索和尝试。我开始积极参加各种课外活动,尝试不同的兴趣爱好,学习不同的技能。我参加了辩论社,锻炼了我的思辨能力和表达能力;我参加了志愿者活动,让我体会到奉献的快乐和责任;我开始阅读各种书籍,拓宽我的知识面和视野。

在这个过程中,我经历了很多失败和挫折。我曾经在辩论比赛中失利,曾经在志愿者活动中遇到困难,曾经在学习过程中遇到瓶颈。但我没有放弃,我从失败中吸取教训,从困难中寻找突破,从瓶颈中寻找动力。我逐渐明白,失败并不可怕,可怕的是不敢尝试;困难并不可逾越,关键在于寻找方法;瓶颈并不可避免,重要的是不断突破自我。

正如“嫦娥四号”和“天问一号”一样,我们每个人的人生,都需要不断地突破自我,不断地探索未知。月球的背面,曾经是人类无法企及的领域,而如今,它已经被我们成功地探索。深空,是更加遥远和神秘的领域,而我们正在向它不断地迈进。

同样,我们的人生,也需要不断地挑战自我,不断地拓展边界,不断地抵达未知之境。只有这样,我们才能不断地成长,不断地进步,不断地实现自我价值。

破茧之境,并非一蹴而就。它需要勇气,需要毅力,需要坚持。它需要我们不断地学习,不断地思考,不断地实践。它需要我们拥抱变化,接受挑战,克服困难。

当我们最终破茧而出,当我们最终抵达未知之境,我们会发现,原来我们拥有无限的可能,原来我们能够创造无限的价值,原来我们能够定义属于自己的精彩人生。

正如“天问一号”在深空中探索未知,我们每个人也应该在人生的旅程中不断探索,不断挑战,不断突破自我。因为,真正的成长,在于勇敢地面对未知,在于不断地抵达未知之境,在于在未知中定义自我。这,才是我们人生的意义所在。

5.代码生成能力测试

Prompt: 生成一段安卓系统,搜索wifi,显示在列表,并可手动点击连接的代码(兼容安卓10+)

好的,这里提供一个兼容 Android 10+ 的搜索 WiFi 并显示在列表,并可手动点击连接的代码示例。这个示例代码包含了必要的权限申请、WiFi 扫描、列表显示以及连接 WiFi 的逻辑。

注意:

  • 这个代码只是一个基础示例,你需要根据你的实际需求进行修改和完善。
  • 请确保在 AndroidManifest.xml 文件中声明必要的权限。
  • 在 Android 10 及以上版本,需要使用 WifiNetworkSuggestion 来连接 WiFi,而不是直接使用 connect() 方法。

1. AndroidManifest.xml 权限声明

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />

2. Activity 代码

import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiManager;
import android.net.wifi.WifiNetworkSuggestion;
import android.net.wifi.WifiNetworkConfigurator;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;

import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;

import java.util.ArrayList;
import java.util.List;

public class WifiListActivity extends AppCompatActivity {

    private static final int PERMISSION_REQUEST_CODE = 1;
    private WifiManager wifiManager;
    private List<ScanResult> scanResults;
    private ArrayAdapter<String> adapter;
    private ListView listView;
    private Button scanButton;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_wifi_list); // 替换为你的布局文件

        wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
        scanResults = new ArrayList<>();
        adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, scanResults);

        listView = findViewById(R.id.wifi_list); // 替换为你的 ListView ID
        listView.setAdapter(adapter);
        scanButton = findViewById(R.id.scan_button); // 替换为你的 Button ID

        scanButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                scanForWifi();
            }
        });

        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                connectToWifi(position);
            }
        });

        requestPermissions();
    }

    private void requestPermissions() {
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
                || ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, PERMISSION_REQUEST_CODE);
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == PERMISSION_REQUEST_CODE) {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // 权限授予
            } else {
                // 权限拒绝
            }
        }
    }

    private void scanForWifi() {
        scanResults.clear();
        adapter.notifyDataSetChanged();
        wifiManager.startScan();
        List<ScanResult> results = wifiManager.getScanResults();
        if (results != null) {
            scanResults.addAll(results);
            adapter.notifyDataSetChanged();
        }
    }

    private void connectToWifi(int position) {
        ScanResult scanResult = scanResults.get(position);
        String ssid = scanResult.SSID;
        String password = ""; // 如果需要密码,请在此处获取密码
        int securityType = 0; // 根据 WiFi 的安全类型设置

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
            // Android 10 及以上版本
            WifiNetworkSuggestion suggestion = new WifiNetworkSuggestion.Builder()
                    .setSsid(ssid)
                    .setPassword(password)
                    .setSecurityType(securityType)
                    .build();

            WifiNetworkConfigurator configurator = wifiManager.createWifiNetworkConfigurator();
            configurator.addNetwork(suggestion);
            configurator.connect();
        } else {
            // Android 9 及以下版本
            wifiManager.connect(ssid, password, securityType);
        }
    }
}

3. 布局文件 (activity_wifi_list.xml)

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".WifiListActivity">

    <Button
        android:id="@+id/scan_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="扫描 WiFi" />

    <ListView
        android:id="@+id/wifi_list"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

代码解释:

  1. 权限申请:
    • AndroidManifest.xml 文件中声明必要的权限。
    • 在 Activity 中,使用 ActivityCompat.requestPermissions() 申请权限。
  2. WiFi 扫描:
    • wifiManager.startScan() 启动 WiFi 扫描。
    • wifiManager.getScanResults() 获取扫描结果。
  3. 列表显示:
    • 使用 ArrayAdapter 将扫描结果添加到 ListView 中。
  4. 连接 WiFi:
    • 在 ListView 的 OnItemClickListener 中,获取点击的 WiFi 信息。
    • 根据 Android 版本,使用不同的方法连接 WiFi。
      • Android 10 及以上版本:使用 WifiNetworkSuggestionWifiNetworkConfigurator
      • Android 9 及以下版本:使用 wifiManager.connect()

注意事项:

  • 密码获取: 示例代码中,密码为空字符串。你需要根据你的实际需求,获取 WiFi 密码,并将其传递给 connectToWifi() 方法。
  • 安全类型: 示例代码中,安全类型为 0。你需要根据 WiFi 的实际安全类型设置正确的安全类型。
  • 错误处理: 示例代码中没有包含错误处理。你应该添加适当的错误处理,以处理可能发生的异常。
  • UI 优化: 示例代码中的 UI 比较简单。你可以根据你的实际需求,优化 UI 界面。

希望这个示例代码能够帮助你实现 WiFi 搜索和连接功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值