普通视图

发现新文章,点击刷新页面。
昨天以前晨曦的博客

在Linux下通过Docker运行Code Composer Studio

2025年7月21日 18:00

目录

1. CCStudio说明

Docker镜像可在以下位置获取:

1.1 软件配置情况

  1. 目前理论上支持的CCStudio版本:
    • 10.x(已测试版本10.0.0.0001010.4.0.00006
    • 11.x(已测试版本11.0.0.0001211.2.0.00007
    • 12.x(已测试版本12.0.0.0000912.8.1.00005
    • 20.x(已测试版本20.2.0.00012
  2. 支持的Ubuntu版本: ubuntu 20.04及以上版本(已测试版本20.0422.0424.04
  3. 支持安装指定版本的mmWave SDK,已测试版本03.06.02.00-LTS
  4. 支持安装指定版本的SYS/BIOS,已测试版本6.73.01.01

zfb132/ccstudio目的是提供一个在Linux系统上安装Code Composer Studio的Docker镜像,方便在Linux系统(无桌面环境)上使用CCStudio进行TI芯片的开发,尤其是适用于CI/CD场景。用户也可以参考仓库的configure.sh脚本在自己的Linux系统上安装CCStudio

容器内部最重要的三个目录:

  • /ccs_projects:CCStudio项目目录(运行容器必须挂载本地目录到此目录,因为entrypoint.sh脚本会在此目录下查找项目文件)
  • /workspaces:CCStudio工作空间目录(容器内部CCS的工作空间目录为/workspaces,编译结果也存放在此目录下)
  • /opt/ti:TI系列产品的安装目录(容器内部CCStudio、mmwave SDK、SYS/BIOS的安装目录)

不同版本的CCStudio在Linux系统的安装说明:

不同版本的CCStudio命令行程序的使用说明:

2. 构建镜像

2.1 自动

使用make命令自动构建镜像

# 查看可用的目标
make list

# 构建指定的镜像
make ubuntu24.04-20.2.0.00012-mmw

# 逐个构建镜像
make all

# 并行构建镜像(但是输出日志会混在一起)
make -j $(nproc) all

# 生成docker-compose.yaml文件用于并行构建镜像
make gen_compose

# 使用docker-compose构建镜像
docker compose -f docker-compose.yaml --parallel 2 build

2.2 手动

构建镜像的脚本如下:

#   --network host
#   --build-arg "HTTP_PROXY=http://127.0.0.1:9900/" \
#   --build-arg "HTTPS_PROXY=http://127.0.0.1:9900/" \
#   --progress=plain --no-cache

# MMWSDK_COMPONENTS或BIOS_VERSION参数若为空,表示不安装对应组件
export UBUNTU_VERSION=24.04
export CCSTUDIO_VERSION=20.2.0.00012
export CCS_COMPONENTS="PF_MMWAVE,PF_C6000SC,PF_TM4C"
export MMWSDK_VERSION="03.06.02.00-LTS"
export MMWSDK_COMPONENTS="ALL"
export BIOS_VERSION="6.73.01.01"
# 使用major.minor版本号作为ccstudio版本标识
export CCS_VERSION_SHORT=$(echo ${CCSTUDIO_VERSION} | cut -d '.' -f 1-2)
export tag="whuzfb/ccstudio:${CCS_VERSION_SHORT}-ubuntu${UBUNTU_VERSION}"
docker build -t ${tag} . \
  --build-arg "OS_VERSION=${UBUNTU_VERSION}" \
  --build-arg "CCS_VERSION=${CCSTUDIO_VERSION}" \
  --build-arg "CCS_COMPONENTS=${CCS_COMPONENTS}" \
  --build-arg "MMWSDK_VERSION=${MMWSDK_VERSION}" \
  --build-arg "MMWSDK_COMPONENTS=${MMWSDK_COMPONENTS}" \
  --build-arg "BIOS_VERSION=${BIOS_VERSION}"

3. 运行容器

从Docker Hub拉取镜像whuzfb/ccstudio

# 拉取最新版本的ccstudio镜像(20.2-ubuntu24.04-mmw)
docker pull whuzfb/ccstudio:latest

或者使用本地构建的镜像

挂载本地的ccs项目目录到容器内的/ccs_projects目录下并启动构建:

# 假设本地项目目录为 ./mmw_oob
git clone --recursive https://github.com/zfb132/mmw_oob.git ./mmw_oob
# 该目录下包含out_of_box_6843_isk_mss.projectspec文件,且包含Debug编译配置
# 运行以下命令可以在容器内编译该项目
# 如果需要保存结果,那么使用 -v ./results:/workspaces (容器内部CCS的工作目录为/workspaces)
# 默认时区为UTC,可以通过设置 -e TZ=... 来更改时区(例如 -e TZ=Asia/Shanghai)
mkdir ./results
docker run \
  -e TZ=Asia/Shanghai \
  -v ./mmw_oob:/ccs_projects \
  -v ./results:/workspaces \
  -it --rm --name ccstudio whuzfb/ccstudio:latest \
  "out_of_box_6843_isk_mss.projectspec" "Debug"

4. CCStudio组件

可安装的产品系列列表:

Product family Description OS
PF_MSP430 MSP430 ultra-low power MCUs windows-x64, linux-x64, osx
PF_MSP432 SimpleLink™ MSP432™ low power + performance MCUs windows-x64, linux-x64, osx
PF_CC2X SimpleLink™ CC13xx and CC26xx Wireless MCUs windows-x64, linux-x64, osx
PF_CC3X SimpleLink™ Wi-Fi® CC32xx Wireless MCUs windows-x64, linux-x64, osx
PF_CC2538 CC2538 IEEE 802.15.4 Wireless MCUs windows-x64, linux-x64, osx
PF_C28 C2000 real-time MCUs windows-x64, linux-x64, osx
PF_TM4C TM4C12x ARM® Cortex®-M4F core-based MCUs windows-x64, linux-x64, osx
PF_PGA PGA Sensor Signal Conditioners windows-x64, linux-x64, osx
PF_HERCULES Hercules™ Safety MCUs windows-x64, linux-x64, osx
PF_SITARA Sitara™ AM3x, AM4x, AM5x and AM6x MPUs (will also include AM2x for CCS 10.x) windows-x64, linux-x64
PF_SITARA_MCU Sitara™ AM2x MCUs (only supported in CCS 11.x and greater) windows-x64, linux-x64
PF_OMAPL OMAP-L1x DSP + ARM9® Processor windows-x64, linux-x64
PF_DAVINCI DaVinci (DM) Video Processors windows-x64, linux-x64
PF_OMAP OMAP Processors windows-x64, linux-x64
PF_TDA_DRA TDAx Driver Assistance SoCs & Jacinto DRAx Infotainment SoCs windows-x64, linux-x64
PF_C55 C55x ultra-low-power DSP windows-x64, linux-x64
PF_C6000SC C6000 Power-Optimized DSP windows-x64, linux-x64
PF_C66AK_KEYSTONE 66AK2x multicore DSP + ARM® Processors & C66x KeyStone™ multicore DSP windows-x64, linux-x64
PF_MMWAVE mmWave Sensors windows-x64, linux-x64
PF_C64MC C64x multicore DSP windows-x64, linux-x64
PF_DIGITAL_POWER UCD Digital Power Controllers windows-x64, linux-x64

5. 其他参考

Windows电脑配置以太网口访问雷达

2025年5月26日 19:27

目录

1. 总体说明

适用情况: 目的只是调试雷达,且当前没有配置好的交换机或路由器
主要功能: 把雷达的以太网口eth1连接到windows电脑的以太网口(此时两者即可互相ping通,可以ssh),还可以通过windows电脑的无线网络让雷达连接到互联网

其中雷达的eth1口配置如下

  • IP地址示例: 192.168.19.241
  • 子网掩码示例: 255.255.255.0
  • 网关示例: 192.168.19.244(可以自行修改为其他ip,只要与windows电脑的以太网口IP地址一致即可,例如192.168.19.254

windows电脑的以太网口配置如下

  • IP地址示例: 192.168.19.244(只要与雷达网关一致即可,例如192.168.19.254
  • 子网掩码示例: 255.255.255.0
  • 网关: 留空

windows电脑可以替换为其他Linux电脑,配置方法类似

2. windows电脑配置以太网口

  1. 打开控制面板 -> 网络和Internet -> 网络和共享中心 -> 更改适配器设置
  2. 然后再手动修改windows的以太网适配器的IP地址是192.168.19.244(也可以是192.168.19.254),子网掩码是255.255.255.0,保存即可(该适配器可能会显示为未识别的网络,属性信息里面IPv4和IPv6可能会提示无法获取Internet访问权限,这是正常的)

3. 雷达配置ip和网关和路由

# 查看当前网络信息(发现eth1的ip地址是192.168.19.241)
ip a
# 1: 1o:<L0OPBACK,UP,LOWER UP> mtu 16436 qdisc noqueue state UNKNOWN
#     link/loopback 00:00:00:00:00:00 brd60:00:00:00:00:00
#     inet 127.0.0.1/8 scope host lo
#     inet6 ::1/128 scope host
#         valid lft forever preferred lft forever
# 2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo fast state DOWN qlen 1000
#     link/ether 00:0a:aa:aa:aa:aa brd ff:ff:ff:ff:ff:ff
#     inet 192.168.1.0/24 brd 192.168.1.255 scope global eth0
# 3: eth1: <BROADCAST,MULTICAST,UP,LOWER UP> mtu 1500 qdisc pfifo fast state UNKNOWN qlen 1000
#     link/ether 08:1f:ff:ff:ff:ff brd ff:ff:ff:ff:ff:ff
#     inet 192.168.19.241/24 brd 192.168.19.255 scope global eth1
#     inet6 fe80::alf:7lff:fe03:bbc/64 scope link
#         valid lft forever preferred lft forever
# 4: eth2: <BROADCAST,MULTICAST,UP,LOWER UP> mtu 1500 qdisc pfifo fast state UP qlen 1000
#     link/ether 00:0b:bb:bb:bb:bb brd ff:ff:ff:ff:ff:ff
#     inet 172.16.1.0/16 brd 172.16.255.255 scope global eth2
#     inet6 fe80::20b:abff:fed3:2b52/64 scope link
#         valid lft forever preferred lft forever

# 查看默认网关(发现eth1的网关是192.168.19.254)
route -n
# Kernel Ip routing table
# Destination    Gateway          Genmask         Flags   Metric   Ref   User   Iface
# 192.168.19.0   0.0.0.0          255.255.255.0   U       0        0     0      eth1
# 192.168.1.0    0.0.0.0          255.255.255.0   U       0        0     0      eth0
# 172.16.0.0     0.0.0.0          255.255.0.0     U       0        0     0      eth2
# 127.0.0.0      0.0.0.0          255.0.0.0       U       0        0     0      lo
# 0.0.0.0        192.168.19.254   0.0.0.0         UG      0        0     0      eth1

如果不想对雷达进行任何修改,则直接把windows电脑的以太网口IP地址修改为192.168.19.254,子网掩码是255.255.255.0,保存即可。雷达会通过eth1口(ip地址是192.168.19.241)经由windows电脑的以太网口(ip地址是192.168.19.254)互相访问。

如果希望自定义雷达的IP和网关,则可以在雷达上执行以下命令:

# 切换到root用户(192.168.19.241是自己设置的eth1口IP地址,只要与windows电脑的以太网口IP地址在同一网段即可)
ifconfig eth1 192.168.19.241 netmask 255.255.255.0 up
# 删除默认网关
route del default
# 添加新的默认网关(这里的网关是windows电脑的以太网口IP地址)
route add default gw 192.168.19.244 eth1

此时在windows电脑上可以通过ssh连接到雷达:

ssh username@192.168.19.241

但是如果想让雷达访问互联网,则需要在windows电脑上开启网络转发功能,并配置以太网共享无线网络。

4. windows开启路由转发功能

  1. 修改注册表:以管理员身份打开cmd,输入以下命令
     reg add HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters /v IPEnableRouter /D 1 /f
    
  2. 启动Routing and Remote Access服务:以管理员身份打开cmd,输入以下命令
     # 如果报错,就手动去服务中启动
     sc config RemoteAccess start=auto
     sc start RemoteAccess
     sc query RemoteAccess
    

5. windows配置以太网共享无线网络

  1. 配置共享地址段(防止在共享WLAN给ethernet时,弹出对话框提示以太网的ip地址只能是192.168.137.1) 以管理员身份打开cmd,输入以下命令
     reg add "HKLM\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters" -v ScopeAddress -d 192.168.19.142 -f
     reg add "HKLM\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters" -v ScopeAddressBackup -d 192.168.19.142 -f
    

    此处只要ScopeAddressScopeAddressBackup的网段是192.168.19.x即可

  2. 打开控制面板 -> 网络和Internet -> 网络和共享中心 -> 更改适配器设置
  3. 右键点击无线网络连接 -> 属性 -> 共享选项卡
  4. 勾选允许其他网络用户通过此计算机的Internet连接来连接,在下拉框中选择以太网(即windows与雷达连接网线后出现的网络适配器),点击确定

此时雷达就可以通过windows电脑的无线网络访问互联网了,直接在雷达上执行以下命令测试:

ping baidu.com

关于如何使用frp配置远程访问,参考远程访问安装xfce4的内网服务器

在linux系统监控某个程序的执行情况并通知用户

2021年2月11日 13:30

目录

介绍

如果有一个下载任务需要执行(python3 download.py),该任务会下载许多文件,一般将其放在后台执行。但是又需要知道它是否在某个时刻退出,可能是因为:

  • 任务执行完毕,正常结束运行
  • 任务异常退出,可能由于下载的网站爬虫策略限制,也可能是其他原因

无论由于哪个原因,一旦程序停止,都需要立刻用户,所以编写以下代码来实现该功能

代码

使用python语言编写监控程序detect.py文件:

  • 如果需要使用腾讯云发送短信通知,则安装库qcloudsms_py
  • 如果需要使用twilio发送短信通知,则安装库twilio

文件内容如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# author: 'zfb'
# time: 19-06-29 09:52
import datetime
import json
import os
import requests
import socket
import logging
from logging.handlers import RotatingFileHandler
from qcloudsms_py import SmsSingleSender
from qcloudsms_py.httpclient import HTTPError

LOG_FORMAT = "%(asctime)s [%(funcName)s: %(filename)s,%(lineno)d] - %(levelname)s : %(message)s"
DATE_FORMAT = "%m/%d/%Y %H:%M:%S"
LOG_PATH = "./log/"

# 初始化日志文件配置
def initLog(fileName,logger):
    # 创建日志文件夹
    if not os.path.exists(LOG_PATH):
        os.mkdir(LOG_PATH)
    myapp = logging.getLogger(logger)
    myapp.setLevel(logging.DEBUG)
    # 切割日志文件
    handler = RotatingFileHandler(LOG_PATH+fileName, maxBytes=128*1024, backupCount=60)
    handler.setFormatter(logging.Formatter(LOG_FORMAT,DATE_FORMAT))
    myapp.addHandler(handler)
    return myapp


logging = initLog('detect.log', 'detect')

# ------------  使用腾讯云发送短信通知用户  -----------
APP_ID = 1412345678
APP_KEY = "3998d59614123456789b72dd5961405c"
TEMPLATE_ID = 101234
SMS_SIGN = "签名A"
# ------------  使用腾讯云发送短信通知用户  -----------

# ------------  使用twilio发送短信  ------------------
SMS_SID = 'ACb770c5f63aac91c44d97891234567890'
SMS_TOKEN = '42b1294966799e965883181234567890'
SMS_FROM_NUMBER = '+12512123456'
# ------------  使用twilio发送短信  ------------------

# ------------  使用邮箱发信  ------------------------
EMAIL_FROM = 'example@qq.com'
EMAIL_PWD = '123demo'
# ------------  使用邮箱发信  ------------------------

def sendSMS(number, params, app_id=APP_ID, key=APP_KEY, template_id=TEMPLATE_ID, sms_sign=SMS_SIGN):
    ssender = SmsSingleSender(app_id, key)
    try:
        result = ssender.send_with_param(86, number, template_id, 
                params, sign=sms_sign, extend="", ext="")
    except HTTPError as e:
        log = json.dumps(e, ensure_ascii=False)
        logging.error(log)
        print(log)
    except Exception as e:
        log = json.dumps(e, ensure_ascii=False)
        logging.error(log)
        print(log)
    log = json.dumps(result, ensure_ascii=False)
    logging.debug(log)
    print(log)


# 使用twilio的使用账户发送短信
def send_sms(phone, content):
    from twilio.rest import Client
    # 账户信息: twilio.com/console
    account_sid = SMS_SID
    auth_token = SMS_TOKEN
    from_phone_num = SMS_FROM_NUMBER
    client = Client(account_sid, auth_token)
    message = client.messages.create(body=content, from_=from_phone_num, to=phone)
    print(message.sid)


# 使用139邮箱的短信通知功能
def send_email(email, subject, msg):
    from smtplib import SMTPException, SMTP_SSL
    from email.mime.text import MIMEText
    from email.header import Header
    # 发件人
    sender = EMAIL_FROM
    pwd = EMAIL_PWD
    # 三个参数:第一个为文本内容,第二个为plain设置文本格式,第三个为utf-8设置编码
    message = MIMEText(msg,"plain",'utf-8')
    message ['From'] = Header(sender,'utf-8')
    message ['To'] = Header(email,'utf-8')
    message["Subject"] = Header(subject,"utf-8")
    try:
        # 使用非本地服务器,需要建立ssl连接
        smtpObj = SMTP_SSL("smtp.exmail.qq.com", 465)
        smtpObj.login(sender,pwd)
        smtpObj.sendmail(sender,email,message.as_string())
        print("邮件发送成功")
    except SMTPException as e:
        print("Error:无法发送邮件.Case:%s"%e)


# 检测下载进程是否正在运行
def isRunning(search_param):
    output = os.popen('ps -ef | grep {}'.format(search_param))
    length = 0
    for line in output:
        # print(line)
        if "/bin/sh" in line or "grep" in line or "Terminated" in line:
            continue
        length = length + 1
    # print(length)
    return True if length > 0 else False


# 获取系统用户名和ip
def getInfomation():
    user = socket.gethostname()
    # 创建socket访问DNS来获取本机的IP,如果是NAT的话,则是局域网IP
    local_ip = "127.0.0.1"
    try:
        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        s.connect(('1.1.1.1', 80))
        local_ip = s.getsockname()[0]
    finally:
        s.close()
    # 访问www.ip.cn网站获取公网IP
    net_ip = "127.0.0.1"
    try:
        net_ip = requests.get('https://api.ipify.org').text
    finally:
        pass
    return (user, local_ip, net_ip)


if __name__ == "__main__":
    status = isRunning("download.py")
    flag_file = "/home/ubuntu/flag"
    # now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    if status:
        logging.debug("program is running")
    else:
        if os.path.isfile(flag_file):
            logging.error("program stopped, nobody fixed it.")
        else:
            info = getInfomation()
            msg = "您的主机{},公网IP地址为{},局域网IP为{},下载进程已中断".format(info[0], info[2], info[1])
            phone = "13612345678"
            sendSMS(phone, ['spy', msg])
            send_sms(phone, msg)
            send_email("user@qq.com", "spy", msg)
            with open(flag_file, "w+") as file:
                file.write("Please delete me after restarting the download program.")
            logging.error("program stopped")

运行监控代码文件

在终端输入crontab -e打开定时管理任务,然后在文件中最后添加一行,内容如下:
*/30 * * * * python3 /home/ubuntu/detect.py
此代码表示每隔30min运行一次
注意:每次重新启动下载进程之后,务必删除flag文件(为了防止因为没有及时重启下载进程而浪费短信资源,在主目录~下输入rm flag即可删除此文件)

ubuntu系统配置基于CUDA 11.0的最新深度学习环境

2020年12月13日 17:24

目录

1. 深度学习硬件环境参数

服务器的硬件配置如下:

  • CPU型号:2 * (Intel Xeon Gold 5218 @ 2.3GHz * 32)
  • 内存大小:12 * (32GB 2663MHz)
  • GPU型号:8 * (GeForce GTX 2080 Ti)
  • 硬盘:
    • 系统(RAID 1):2 * (960GB SSD) = 960GB
    • 数据(RAID 6):6 * (10T HDD 7200rpm) = 40TB

系统和各基础软件的版本都在下表中列出:

  • 操作系统版本:Ubuntu 18.04-amd64
  • 英伟达显卡驱动:nvidia-driver-450
  • CUDA版本:11.0.3
  • cuDNN版本:8.0.4
  • Python版本:3.6.9
  • tensorflow版本:tf-nightly-2.5.0.dev20201209

2. 深度学习系统环境配置

2.1 安装nvidia驱动

目前我使用过的方法有三种,按照便捷程度依次降低的顺序来介绍

  • 推荐方法(在图形窗口操作):
    • 打开软件Software & Updates(系统和更新)
    • 点击选项Additional drivers(附加驱动)
    • 选定nvidia driver meta nvidia-450
    • 点击按钮Apply changes(应用更改)
  • 备用方法:
    • 打开终端,依次输入以下命令:
      sudo add-apt-repository ppa:graphics-drivers/ppa
      sudo apt update
      sudo apt install nvidia-driver-450
      
  • 最后的方法:访问nvidia官网下载适用于ubuntu的驱动包,一般为.run格式。然后在终端运行,根据提示操作即可

不管哪种方法,都需要重启电脑。然后,在终端输入nvidia-smi命令得到如下示例输出则表明安装成功

Thu Dec 10 15:42:47 2020       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 450.80.02    Driver Version: 450.80.02    CUDA Version: 11.0     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  GeForce RTX 208...  Off  | 00000000:3D:00.0 Off |                  N/A |
| 28%   30C    P8     9W / 250W |      6MiB / 11019MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
|   1  GeForce RTX 208...  Off  | 00000000:3E:00.0 Off |                  N/A |
| 27%   29C    P8     5W / 250W |      6MiB / 11019MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
|   2  GeForce RTX 208...  Off  | 00000000:40:00.0 Off |                  N/A |
| 27%   29C    P8    17W / 250W |      6MiB / 11019MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
|   3  GeForce RTX 208...  Off  | 00000000:41:00.0 Off |                  N/A |
| 27%   28C    P8    22W / 250W |      6MiB / 11019MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
|   4  GeForce RTX 208...  Off  | 00000000:B1:00.0 Off |                  N/A |
| 27%   29C    P8     3W / 250W |      6MiB / 11019MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
|   5  GeForce RTX 208...  Off  | 00000000:B2:00.0 Off |                  N/A |
| 27%   29C    P8    14W / 250W |      6MiB / 11019MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
|   6  GeForce RTX 208...  Off  | 00000000:B4:00.0 Off |                  N/A |
| 29%   31C    P8    20W / 250W |      6MiB / 11019MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
|   7  GeForce RTX 208...  Off  | 00000000:B5:00.0 Off |                  N/A |
| 27%   29C    P8     7W / 250W |      6MiB / 11019MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|    0   N/A  N/A     16810      G   /usr/lib/xorg/Xorg                  4MiB |
|    1   N/A  N/A     16810      G   /usr/lib/xorg/Xorg                  4MiB |
|    2   N/A  N/A     16810      G   /usr/lib/xorg/Xorg                  4MiB |
|    3   N/A  N/A     16810      G   /usr/lib/xorg/Xorg                  4MiB |
|    4   N/A  N/A     16810      G   /usr/lib/xorg/Xorg                  4MiB |
|    5   N/A  N/A     16810      G   /usr/lib/xorg/Xorg                  4MiB |
|    6   N/A  N/A     16810      G   /usr/lib/xorg/Xorg                  4MiB |
|    7   N/A  N/A     16810      G   /usr/lib/xorg/Xorg                  4MiB |
+-----------------------------------------------------------------------------+

2.2 安装CUDA

访问CUDA 11.0 Update 1的下载网址,选择适合自己操作系统版本的文件下载,然后打开终端依次输入以下命令:

wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/cuda-ubuntu1804.pin
sudo mv cuda-ubuntu1804.pin /etc/apt/preferences.d/cuda-repository-pin-600
wget https://developer.download.nvidia.com/compute/cuda/11.0.3/local_installers/cuda-repo-ubuntu1804-11-0-local_11.0.3-450.51.06-1_amd64.deb
sudo dpkg -i cuda-repo-ubuntu1804-11-0-local_11.0.3-450.51.06-1_amd64.deb
sudo apt-key add /var/cuda-repo-ubuntu1804-11-0-local/7fa2af80.pub
sudo apt-get update
sudo apt-get install cuda

此时CUDA以及安装完毕,在终端输入cd /usr/local/cuda-11.0/bin && ./nvcc -V命令得到如下示例输出则表明安装成功

nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2020 NVIDIA Corporation
Built on Wed_Jul_22_19:09:09_PDT_2020
Cuda compilation tools, release 11.0, V11.0.221
Build cuda_11.0_bu.TC445_37.28845127_0

但是,为了方便下面深度学习软件的使用,还要把相关路径加入PATH。打开文件~/.profile(若不存在则新建) ,在文档末尾添加以下内容:

# set PATH for cuda 11.0 installation
if [ -d "/usr/local/cuda-11.0/bin/" ]; then
    export PATH=/usr/local/cuda-11.0/bin${PATH:+:${PATH}}
    export LD_LIBRARY_PATH=/usr/local/cuda-11.0/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
fi

重启计算机即可使环境变量生效

2.3 安装cuDNN

打开cuDNN的下载网址,然后点击cuDNN v8.0.4 (September 28th, 2020), for CUDA 11.0并根据自己的操作系统选择合适的版本。其中,cuDNN Runtime LibrarycuDNN Developer Library是必须要下载的,cuDNN Code Samples and User Guide为可选项目。然后依次安装前面下载的3个文件:

sudo dpkg -i libcudnn8_8.0.4.30-1+cuda11.0_amd64.deb
sudo dpkg -i libcudnn8-dev_8.0.4.30-1+cuda11.0_amd64.deb
sudo dpkg -i libcudnn8-samples_8.0.4.30-1+cuda11.0_amd64.deb

此时,显卡已经配置完成

3. python3软件环境配置

创建基于python3的虚拟环境,然后安装深度学习需要用到的库:

# 安装python3开发库
sudo apt-get install python3-pip python3-venv
# 创建名称为myvenv的虚拟环境
python3 -m venv myvenv
# 激活myvenv虚拟环境
source myvenv/bin/activate
# pip安装深度学习相关第三方库
pip3 install tf-nightly -i https://pypi.python.org/simple

注意

  • 确保下载的是tf-nightly-2.5.0.dev20201209(目前的最新版)
  • 使用pypi的镜像源可能导致版本不是最新的
  • tensorflow包目前还不支持CUDA 11.0,它最高支持CUDA 10.1
  • 如果安装tensorflow遇到报错launchpadlib 1.10.6 requires testresources, which is not installed,执行以下代码:
    # sudo apt install python3-widgetsnbextension
    sudo apt install python3-testresources
    

    4. Ubuntu 20.04系统注意事项

  • 不同之处:CUDA版本号不变,但选择用于Ubuntu 20.04系统
  • 不同之处:cuDNN版本选择8.0.5且用于Ubuntu 20.04系统
  • 其他步骤同Ubuntu 18.04
❌
❌