0%

These four commands quickly and quietly install the latest 64-bit version of the installer and then clean up after themselves. To install a different version or architecture of Miniconda for Linux, change the name of the .sh installer in the wget command.

1
2
3
4
mkdir -p ~/miniconda3
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda3/miniconda.sh
bash ~/miniconda3/miniconda.sh -b -u -p ~/miniconda3
rm -rf ~/miniconda3/miniconda.sh

After installing, initialize your newly-installed Miniconda. The following commands initialize for bash and zsh shells:

1
2
~/miniconda3/bin/conda init bash
~/miniconda3/bin/conda init zsh

Miniconda — miniconda documentation

一、搭建虚拟环境

1
2
3
4
# 创建虚拟环境
conda create -n chatglm3-demo python=3.10
# 激活虚拟环境
conda activate chatglm3-demo

二、环境安装

首先需要下载本仓库:

1
2
git clone https://github.com/THUDM/ChatGLM3
cd ChatGLM3

然后使用 pip 安装依赖:

1
pip install -r requirements.txt

三、模型下载

软件依赖

1
pip install protobuf 'transformers>=4.30.2' cpm_kernels 'torch>=2.0' gradio mdtex2html sentencepiece accelerate

模型下载

modelscope API下载

1
pip install modelscope
1
2
from modelscope import snapshot_download 
model_dir = snapshot_download("ZhipuAI/chatglm3-6b", revision = "v1.0.0")

请注意,本项目需要 Python 3.10 或更高版本。

此外,使用 Code Interpreter 还需要安装 Jupyter 内核:

安装ipython3

1
sudo apt install ipython3

安装Jupyter内核

1
ipython3 kernel install --name chatglm3-demo --user

安装streamlit

1
conda install streamlit

设置模型本地路径

1
export MODEL_PATH=/home/jianhai/.cache/modelscope/hub/ZhipuAI/chatglm3-6b

启动demo

1
streamlit run main.py

一 虚拟环境基础知识

Python在开发人员中大受欢迎,最大的原因之一是它广泛且不断扩大的第三方包选择。虚拟环境可以为每个项目创建单独的隔离环境,达到分离不同项目的依赖关系的目的。

Python有针对不同应用程序的各种模块和包。在我们的项目开发中,可能需要一些三方库,那么就需要安装这个库,而另一个项目可能不需要任何其他第三方包,或者是需要其中某些三方包的其他的版本。当不同的Python项目需要相同插件的竞争或不兼容版本时,就会出现问题,导致程序莫名的异常。

另外开发用的电脑,可能同时安装了Python2和Python3,而Python2和Python3又有更多的小版本号,而有些现成的项目可能开发比较早,只支持用Python2编译,而有些则必须要Python3才行,这样如果没有隔离,则也会导致程序无法运行。

因此,虚拟环境此时能够发挥作用,为不同的Python安装版本、或不同的项目创建单独的隔离环境,每个项目可以从其特定的环境中存储和检索包,使用特定的Python版本。

二 如何使用虚拟环境

这里通过具体操作执行进行示例说明。

2.1 安装virtualenv

要创建虚拟环境,需要先安装一个名为virtualenv的模块。首先要确保在计算机上安装了pip。

1
2
3
4
5
6
# 如果计算机上没有安装pip,需使用以下命令先安装pip,不同的操作系统命令会有差异:
sudo apt-get install python-pip

# 然后通过pip来安装virtualenv,安装后可以检查下virtualenv的版本:
pip install virtualenv
virtualenv --version

2.2 创建虚拟环境并激活

成功安装virtualenv之后,可以使用以下命令创建一个特定名称的虚拟环境:

1
2
3
4
5
6
7
8
9
10
11
12
13
# 创建特定名称的虚拟环境,myvenv可以换成任意你喜欢的名字都行
virtualenv myvenv
# 执行以上命令会创建myvenv的文件夹,包含运行Python项目所需的所有可执行文件

# 如果要指定Python版本,可以通过下面指令来创建虚拟环境:
python2.7 virtualenv myvenv # 创建使用Python2.7的虚拟环境
# 也可以通过下面的命令来创建虚拟环境,效果和上面的一样的
python3 -m venv myvenv # 创建使用Python3的虚拟环境

# 在创建好虚拟环境后,还需要用如下命令启用,激活进入特定的隔离环境
source venv/bin/activate
# 如果是在Windows系统下,上面的激活命令略有差异:
venv/Scripts/activate

成功激活进入虚拟环境后,如下图所示,会在命令行前面看到有(.venv)的标志:

成功创建并激活了虚拟环境后,就可以安装项目所需的依赖项和需求,而不会干扰到其他项目了。

2.3 退出虚拟环境

一旦完成了当前项目的工作,可以返回到系统默认环境,只需要使用deactivate命令即可退出。

三 虚拟环境的工作原理

如果没有使用虚拟环境时,Python的第三方包都会被pip安装到Python安装路径的site-packages目录下。当使用虚拟环境时,按照前面的“python3 -m venv myvenv”等方式创建虚拟环境后,可以查看当前目录,会看到几个文件:

  • bin目录:python3、pip3等可执行文件,其实就是是软链接到Python系统目录(或者是复制的副本)的
  • lib/python3.10/site-packages:用于该虚拟环境下安装的三方包的存储目录的

所以,通过venv,会将系统的Python软链接到venv的环境下,当用source命令激活虚拟环境时,就会启用该venv下面的python和pip了,同时过程中安装的三方包都是放在venv/lib/pythonx.x/site-packages下面的,这样系统的Python环境是不会受到任何影响的。

四 虚拟环境的更多用法

4.1 三方包依赖需求生成与重新安装

如前所述,在创建一个新的虚拟环境后,pip和setuptools包会被软链接(或复制)到虚拟环境下,接下来可以安装在环境中使用的任何其他包。对于具有复杂需求的项目,在项目的根目录中最好能保留一个requirements.txt的文件,这个文件列出了项目的三方包依赖的需求。这样,如果需要重新创建虚拟环境,可以使用pip install -r requirements.txt命令重新安装所有需要的包。

在项目的虚拟环境中安装完所需的库后,可使用pip list查看当前所有已安装的库,然后可以通过运行以下命令生成一个文本文件,列出所有项目依赖项:

1
pip freeze > requirements.txt

那么在其他计算机上重新搭建这个项目的环境时,则可以快速通过如下命令,一次将所有依赖的三方包安装齐全:

1
pip install -r requirements.txt

4.2 虚拟环境更新升级

虚拟环境中的pip和setuptools副本是该虚拟环境的本地副本,需要独立地进行更新和维护。所以会遇到某些虚拟环境中pip过时的警告,而在其他虚拟环境中则不会,pip必须在每个虚拟环境中分别更新才行。

因此当升级系统上的Python运行时时,使用该版本的Python的虚拟环境是不会自动升级的,这样设计也是合理的,因为无意中升级到新Python版本可能会破坏它们的三方包依赖。

具体的虚拟环境更新升级操作如下:

Python小版本升级:

如果已经升级了一个现有的Python小版本,比如从Python 3.9.5到Python 3.9.7,那么可以在项目目录下通过如下方式升级虚拟环境(不要提前激活虚拟环境,否则可能导致升级失败):

1
python -m venv myvenv --upgrade

Python大版本升级:

如果已经安装了一个主要的新版本的Python,比如已经有了Python 3.8,现在将安装Python 3.9,那么就不要用上面的升级方式了,而是重新创建一个新的虚拟环境,专门使用新的Python大版本。

@RestController注解相当于@ResponseBody + @Controller合在一起的作用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {
String value() default "";
}



@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Controller {
String value() default "";
}
  1. 如果只是使用@RestController注解Controller,则Controller中的方法无法返回jsp页面,配置的视图解析器InternalResourceViewResolver不起作用,返回的内容就是Return 里的内容。

  2. 如果需要返回到指定页面,则需要用 @Controller配合视图解析器InternalResourceViewResolver才行。

  3. 如果需要返回JSON,XML或自定义mediaType内容到页面,则需要在对应的方法上加上@ResponseBody注解。

问题描述

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
Caused by: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is java.sql.SQLSyntaxErrorException: ORA-00923: 未找到要求的 FROM 关键字

at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:81) ~[spring-jdbc-5.0.7.RELEASE.jar:5.0.7.RELEASE]
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:371) ~[spring-jdbc-5.0.7.RELEASE.jar:5.0.7.RELEASE]
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:446) ~[spring-jdbc-5.0.7.RELEASE.jar:5.0.7.RELEASE]
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:456) ~[spring-jdbc-5.0.7.RELEASE.jar:5.0.7.RELEASE]
at org.springframework.jdbc.core.JdbcTemplate.queryForList(JdbcTemplate.java:484) ~[spring-jdbc-5.0.7.RELEASE.jar:5.0.7.RELEASE]
at com.app.base.framework.jpa.service.BaseJdbcTemplateServiceImpl.queryListMapBySql(BaseJdbcTemplateServiceImpl.java:35) ~[classes/:?]
... 127 more
Caused by: java.sql.SQLSyntaxErrorException: ORA-00923: 未找到要求的 FROM 关键字

at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:445) ~[ojdbc6-11.2.0.3.jar:11.2.0.3.0]
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:396) ~[ojdbc6-11.2.0.3.jar:11.2.0.3.0]
at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:879) ~[ojdbc6-11.2.0.3.jar:11.2.0.3.0]
at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:450) ~[ojdbc6-11.2.0.3.jar:11.2.0.3.0]
at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:192) ~[ojdbc6-11.2.0.3.jar:11.2.0.3.0]
at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:531) ~[ojdbc6-11.2.0.3.jar:11.2.0.3.0]
at oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:193) ~[ojdbc6-11.2.0.3.jar:11.2.0.3.0]
at oracle.jdbc.driver.T4CStatement.executeForDescribe(T4CStatement.java:873) ~[ojdbc6-11.2.0.3.jar:11.2.0.3.0]
at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1167) ~[ojdbc6-11.2.0.3.jar:11.2.0.3.0]
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1281) ~[ojdbc6-11.2.0.3.jar:11.2.0.3.0]
at oracle.jdbc.driver.OracleStatement.executeQuery(OracleStatement.java:1491) ~[ojdbc6-11.2.0.3.jar:11.2.0.3.0]
at oracle.jdbc.driver.OracleStatementWrapper.executeQuery(OracleStatementWrapper.java:406) ~[ojdbc6-11.2.0.3.jar:11.2.0.3.0]
at com.alibaba.druid.pool.vendor.OracleValidConnectionChecker.isValidConnection(OracleValidConnectionChecker.java:84) ~[druid-1.1.10.jar:1.1.10]
at com.alibaba.druid.pool.DruidAbstractDataSource.validateConnection(DruidAbstractDataSource.java:1346) ~[druid-1.1.10.jar:1.1.10]
at com.alibaba.druid.pool.DruidAbstractDataSource.createPhysicalConnection(DruidAbstractDataSource.java:1633) ~[druid-1.1.10.jar:1.1.10]
at com.alibaba.druid.pool.DruidDataSource.init(DruidDataSource.java:861) ~[druid-1.1.10.jar:1.1.10]
at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:1229) ~[druid-1.1.10.jar:1.1.10]
at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:1225) ~[druid-1.1.10.jar:1.1.10]
at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:90) ~[druid-1.1.10.jar:1.1.10]
at org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource.getConnection(AbstractRoutingDataSource.java:169) ~[spring-jdbc-5.0.7.RELEASE.jar:5.0.7.RELEASE]
at org.springframework.jdbc.datasource.DataSourceUtils.fetchConnection(DataSourceUtils.java:151) ~[spring-jdbc-5.0.7.RELEASE.jar:5.0.7.RELEASE]

解决方案

配置 validationQuery

1
validationQuery=select 1 from dual