2018-05-17 10:55:52 weixin_32820767 阅读数 26415
  • 3D游戏引擎之GPU渲染(DX篇)

    本次课程主要是针对3D游戏引擎内部的GPU之Shader渲染处理,告诉大家引擎底层是如何与Shader代码结合的。从基本的灯光渲染,环境渲染到后的Bloom渲染。

    12017 人正在学习 去看看 姜雪伟

注:本文适用于Linux环境的操作。

 

1. 指定使用哪一块 GPU: 

先查找有多少块 GPU,并且获得设备编号: 

$ nvidia-smi

在代码执行指定使用哪块GPU:

CUDA_VISIBLE_DEVICES=0 ./myapp

 

指定使用第0块或者第0,1块GPU:

import os
os.environ['CUDA_VISIBLE_DEVICES'] = '0'
os.environ['CUDA_VISIBLE_DEVICES'] = '0,1'

 

2 在tf.estimator() 控制GPU资源使用率:

    session_config = tf.ConfigProto(log_device_placement=True)
    session_config.gpu_options.per_process_gpu_memory_fraction = 0.5
    run_config = tf.estimator.RunConfig().replace(session_config=session_config)

    # Instantiate Estimator
    nn = tf.estimator.Estimator(model_fn=model_fn, config=run_config, params=model_params)

 

3 tf.Config() 还可以这样用:

356   session_config = tf.ConfigProto(
          log_device_placement=True
357       inter_op_parallelism_threads=0,
358       intra_op_parallelism_threads=0,
359       allow_soft_placement=True)
360 
361   #lingfeng
362   session_config.gpu_options.allow_growth = True
363   session_config.gpu_options.allocator_type = 'BFC'

具体解释


log_device_placement=True

  • 设置为True时,会打印出TensorFlow使用了那种操作

 

inter_op_parallelism_threads=0

  • 设置线程一个操作内部并行运算的线程数,比如矩阵乘法,如果设置为0,则表示以最优的线程数处理

 

intra_op_parallelism_threads=0

  • 设置多个操作并行运算的线程数,比如 c = a + b,d = e + f . 可以并行运算

 

allow_soft_placement=True

  • 有时候,不同的设备,它的cpu和gpu是不同的,如果将这个选项设置成True,那么当运行设备不满足要求时,会自动分配GPU或者CPU。

 

参考代码:

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

import os
import argparse
import sys
import tempfile

# Import urllib
from six.moves import urllib

import numpy as np
import tensorflow as tf

FLAGS = None
os.environ['CUDA_VISIBLE_DEVICES'] = '0'
# 开启loggging.
tf.logging.set_verbosity(tf.logging.INFO)


# 定义下载数据集.
def maybe_download(train_data, test_data, predict_data):
    """Maybe downloads training data and returns train and test file names."""
    if train_data:
        train_file_name = train_data
    else:
        train_file = tempfile.NamedTemporaryFile(delete=False)
        urllib.request.urlretrieve(
            "http://download.tensorflow.org/data/abalone_train.csv",
            train_file.name)
        train_file_name = train_file.name
        train_file.close()
        print("Training data is downloaded to %s" % train_file_name)

    if test_data:
        test_file_name = test_data
    else:
        test_file = tempfile.NamedTemporaryFile(delete=False)
        urllib.request.urlretrieve(
            "http://download.tensorflow.org/data/abalone_test.csv", test_file.name)
        test_file_name = test_file.name
        test_file.close()
        print("Test data is downloaded to %s" % test_file_name)

    if predict_data:
        predict_file_name = predict_data
    else:
        predict_file = tempfile.NamedTemporaryFile(delete=False)
        urllib.request.urlretrieve(
            "http://download.tensorflow.org/data/abalone_predict.csv",
            predict_file.name)
        predict_file_name = predict_file.name
        predict_file.close()
        print("Prediction data is downloaded to %s" % predict_file_name)

    return train_file_name, test_file_name, predict_file_name


def model_fn(features, labels, mode, params):
  """Model function for Estimator."""

  # Connect the first hidden layer to input layer
  # (features["x"]) with relu activation
  first_hidden_layer = tf.layers.dense(features["x"], 10, activation=tf.nn.relu)

  # Connect the second hidden layer to first hidden layer with relu
  second_hidden_layer = tf.layers.dense(
      first_hidden_layer, 10, activation=tf.nn.relu)

  # Connect the output layer to second hidden layer (no activation fn)
  output_layer = tf.layers.dense(second_hidden_layer, 1)

  # Reshape output layer to 1-dim Tensor to return predictions
  predictions = tf.reshape(output_layer, [-1])

  # Provide an estimator spec for `ModeKeys.PREDICT`.
  if mode == tf.estimator.ModeKeys.PREDICT:
    return tf.estimator.EstimatorSpec(
        mode=mode,
        predictions={"ages": predictions})

  # Calculate loss using mean squared error
  loss = tf.losses.mean_squared_error(labels, predictions)

  # Calculate root mean squared error as additional eval metric
  eval_metric_ops = {
      "rmse": tf.metrics.root_mean_squared_error(
          tf.cast(labels, tf.float64), predictions)
  }

  optimizer = tf.train.GradientDescentOptimizer(
      learning_rate=params["learning_rate"])
  train_op = optimizer.minimize(
      loss=loss, global_step=tf.train.get_global_step())

  # Provide an estimator spec for `ModeKeys.EVAL` and `ModeKeys.TRAIN` modes.
  return tf.estimator.EstimatorSpec(
      mode=mode,
      loss=loss,
      train_op=train_op,
      eval_metric_ops=eval_metric_ops)







# 创建main()函数,加载train/test/predict数据集.

def main(unused_argv):
    # Load datasets
    abalone_train, abalone_test, abalone_predict = maybe_download(
        FLAGS.train_data, FLAGS.test_data, FLAGS.predict_data)

    # Training examples
    training_set = tf.contrib.learn.datasets.base.load_csv_without_header(
        filename=abalone_train, target_dtype=np.int, features_dtype=np.float64)

    # Test examples
    test_set = tf.contrib.learn.datasets.base.load_csv_without_header(
        filename=abalone_test, target_dtype=np.int, features_dtype=np.float64)

    # Set of 7 examples for which to predict abalone ages
    prediction_set = tf.contrib.learn.datasets.base.load_csv_without_header(
        filename=abalone_predict, target_dtype=np.int, features_dtype=np.float64)


    train_input_fn = tf.estimator.inputs.numpy_input_fn(
        x={"x": np.array(training_set.data)},
        y=np.array(training_set.target),
        num_epochs=None,
        shuffle=True)

    LEARNING_RATE = 0.1
    model_params = {"learning_rate": LEARNING_RATE}

    session_config = tf.ConfigProto(log_device_placement=True)
    session_config.gpu_options.per_process_gpu_memory_fraction = 0.5
    run_config = tf.estimator.RunConfig().replace(session_config=session_config)

    # Instantiate Estimator
    nn = tf.estimator.Estimator(model_fn=model_fn, config=run_config, params=model_params)


    print("training---")
    nn.train(input_fn=train_input_fn, steps=5000)

    # Score accuracy
    test_input_fn = tf.estimator.inputs.numpy_input_fn(
        x={"x": np.array(test_set.data)},
        y=np.array(test_set.target),
        num_epochs=1,
        shuffle=False)

    ev = nn.evaluate(input_fn=test_input_fn)
    print("Loss: %s" % ev["loss"])
    print("Root Mean Squared Error: %s" % ev["rmse"])


if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.register("type", "bool", lambda v: v.lower() == "true")
    parser.add_argument(
        "--train_data", type=str, default="", help="Path to the training data.")
    parser.add_argument(
        "--test_data", type=str, default="", help="Path to the test data.")
    parser.add_argument(
        "--predict_data",
        type=str,
        default="",
        help="Path to the prediction data.")
    FLAGS, unparsed = parser.parse_known_args()
    tf.app.run(main=main, argv=[sys.argv[0]] + unparsed)

 

参考: 使用tf.estimator中创建Estimators

2019-11-04 22:33:30 bossdmy 阅读数 15
  • 3D游戏引擎之GPU渲染(DX篇)

    本次课程主要是针对3D游戏引擎内部的GPU之Shader渲染处理,告诉大家引擎底层是如何与Shader代码结合的。从基本的灯光渲染,环境渲染到后的Bloom渲染。

    12017 人正在学习 去看看 姜雪伟

1、查看服务器上的cuda和cudnn版本

cat /usr/local/cuda/version.txt

cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2

查看现有的python版本

ll /usr/bin/pyth*

 

2、查找能对应安装的tensorflow版本

3、我遇到的问题:

之前讲python的版本从3.6升级到了3.7,所以tensorflow安装2.0a.0版本过高,出现各种问题,

时间花费在解决lib库的问题上

后来咨询师兄发现两个问题(1)安装的tensorflow-gpu版本过高,(2) conda命令不好用,原因之前升级了python,环境配置出现问题

解决方法:

https://stackoverflow.com/questions/19825250/after-anaconda-installation-conda-command-fails-with-importerror-no-module-na

删除anaconda3重新执行sh文件,安装anaconda

The solution

The solution that works for me is pretty simple... reinstall anaconda. I don't know if this is the optimal solution, but this what works for me.

  • First we need to delete the old installation:

rm -rf ~/anaconda3 rm -rf ~/.condarc ~/.conda ~/.continuum

  • Then, reinstall Anaconda.
  • Finally, update all packages (including conda itself) using:

conda update --all

Now, your anaconda is up-to-date.

 

4、安装anaconda之后配置环境

vim ~/.bash_profile

source ~/.bash_profile

 

5、conda命令执行后,pip安装tensorflow-gpu版本,之前因为版本安装1.13.1出现问题,降为1.7.1版本,问题解决

在安装时建议采用清华镜像:

pip install tensorflow-gpu==1.7.0 -i https://pypi.tuna.tsinghua.edu.cn/simple

卸载tensorflow-gpu时,需要将三个tensor*文件uninstall

6、在运行程序时,查看内存nvidia-smi

出现内存溢出问题,故每次运行需要限制内存

2017-07-15 16:53:23 u013828589 阅读数 1230
  • 3D游戏引擎之GPU渲染(DX篇)

    本次课程主要是针对3D游戏引擎内部的GPU之Shader渲染处理,告诉大家引擎底层是如何与Shader代码结合的。从基本的灯光渲染,环境渲染到后的Bloom渲染。

    12017 人正在学习 去看看 姜雪伟

Win10 安装 anaconda + gpu-tensorflow

1.CUDA安装

CUDA® 是 NVIDIA 创造的一个并行计算平台和编程模型。它利用图形处理器 (GPU) 能力,实现计算性能的显著提高。

1.命令行中输入dxdiag,可以看自己的电脑配置,用来选对应的英伟达开发包驱动,登录https://developer.nvidia.com查看CUDA是否支持自己的GPU。

注意:需下载cuda-8.0!

2.下载安装
下载路径
注:网站链接不稳定,需要多测试几次

2.CUDNN安装

The NVIDIA CUDA® Deep Neural Network library (cuDNN) is a GPU-accelerated library of primitives for deep neural networks. cuDNN provides highly tuned implementations for standard routines such as forward and backward convolution, pooling, normalization, and activation layers. cuDNN is part of the NVIDIA Deep Learning SDK.

下载链接
下载完实际上就是压缩包,解压后看步骤3

注意:需下载cudnn-5.1!

3.关联路径

把CUDNN文件夹下的文件复制到CUDA安装目录对应同名文件夹下

4.安装anaconda

注意:需下载python-3.6或python3.5版本!

Anaconda下载链接
注:下载的时候需要选择windows_python3.6版本,这个网站同样连接不稳定,需多测试几次,安装的时候需注意要勾选两个对勾,让python添加到系统路径。

5.创建python3.5开发环境

anaconda支持创建多个python版本环境。可以同时装python2,python3.4 … ,且相互之间不影响。

conda create -n py35 python=3.5

注: gpu-tensorflow 暂时不支持python3.6,若下载下来的anaconda为python3.6版本,需创建3.5环境。

每次运行python3.5的时候,需要激活环境:

activate py35

更多关于anaconda的指令移步此处:
anaconda Cheatsheet

6.安装gpu-tensorflow

不建议用源码安装,可以选择用pip安装或conda安装。

pip install tensorflow-gpu

有时候用pip安装tensorflow速度极慢且不会断点下载,可以考虑用anaconda安装。

conda install tensorflow-gpu

7.运行测试

创建名为gpu_test.py 的文件,文件内容如下

# 新建一个 graph.
a = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[2, 3], name='a')
b = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[3, 2], name='b')
c = tf.matmul(a, b)
# 新建session with log_device_placement并设置为True.
sess = tf.Session(config=tf.ConfigProto(log_device_placement=True))
# 运行这个 op.
print sess.run(c)

命令行测试运行

python gpu_test.py

如果得到以下类似结果,说明GPU分配成功

Device mapping:
/job:localhost/replica:0/task:0/gpu:0 -> device: 0, name: Tesla K40c, pci bus
id: 0000:05:00.0
b: /job:localhost/replica:0/task:0/gpu:0
a: /job:localhost/replica:0/task:0/gpu:0
MatMul: /job:localhost/replica:0/task:0/gpu:0
[[ 22.  28.]
 [ 49.  64.]]

可能遇到的问题

1. python版本为3.6

会提示一堆找不到DLL的信息,按照别的博客上设置环境变量的方法,毫无作用。

2.不要轻易安装dll

许多博客上会说如果dll未加载的时候去下载安装mscp140.dll(实际上就是转载Github上的问答),如果装了vs的最好不要去下,先去c盘检测system32文件夹下有没有这个dll。

3.anaconda的好处

anaconda安装gpu-tensorflow不需经过源码安装,而且随时创建虚拟环境,是python开发最好的工具之一。自己从源码安装有时会有一些问题。

4.CUDA不要更新

Nvidia有时会更新CUDA,更新后会偶尔会出现不兼容问题

5.CUDA和CUDNN版本问题

按照本博客中的版本选择可以成功安装,测试了其他版本CUDNN会出现问题。

不推荐手工安装gpu-tensorflow,需要设置环境等且容易出错。

2019-02-21 11:44:14 ccmmfit 阅读数 38
  • 3D游戏引擎之GPU渲染(DX篇)

    本次课程主要是针对3D游戏引擎内部的GPU之Shader渲染处理,告诉大家引擎底层是如何与Shader代码结合的。从基本的灯光渲染,环境渲染到后的Bloom渲染。

    12017 人正在学习 去看看 姜雪伟

Linux常用指令

  • 查找cc所在目录

which cc

  • 列出文件

ls

  • 查找文件名为cc的所在目录

find -name cc

  • 查看gpu信息

lspci | grep -i vga

  • 解压tar.gz文件

tar -zxvf ×××.tar.gz

  • 解压tar.bz2文件

tar -jxvf ×××.tar.bz2

  • 查看磁盘空间

df -h

  • 查找cc进程

ps -ef | grep cc

  • 查看8080端口是否被占用

lsof -i:8080

netstat -anp | grep 8080

2019-03-20 11:46:49 rong11417 阅读数 800
  • 3D游戏引擎之GPU渲染(DX篇)

    本次课程主要是针对3D游戏引擎内部的GPU之Shader渲染处理,告诉大家引擎底层是如何与Shader代码结合的。从基本的灯光渲染,环境渲染到后的Bloom渲染。

    12017 人正在学习 去看看 姜雪伟

原文:https://www.binarytides.com/linux-get-gpu-information/

译文:

您需要找到正确的型号和供应商的图形卡在您的系统上,能够安装适当的驱动程序,并使硬件功能正常。大多数现代linux发行版可以检测各种显卡,但并不总是有最佳的驱动程序。

 

因此,如果您拥有像Nvidia或Ati这样的外部显卡,那么您需要查找模型名称/编号,然后在线查找进一步的详细信息。当然,如果你有购买电脑时附带的硬件手册,就会容易得多。但是这里我们将使用命令来找出相同的信息。

硬件细节

这只是一些需要学习的命令。第一个是lscpi,下面是一个快速示例,展示如何获取图形单元(也称为vga卡或视频卡)的详细信息。

$ lspci -vnn | grep VGA -A 12
00:02.0 VGA compatible controller [0300]: Intel Corporation 82G35 Express Integrated Graphics Controller [8086:2982] (rev 03) (prog-if 00 [VGA controller])
        Subsystem: Intel Corporation Device [8086:d701]
        Flags: bus master, fast devsel, latency 0, IRQ 44
        Memory at e0200000 (32-bit, non-prefetchable) [size=1M]
        Memory at d0000000 (64-bit, prefetchable) [size=256M]
        I/O ports at 2440 [size=8]
        Expansion ROM at <unassigned> [disabled]
        Capabilities: <access denied>
        Kernel driver in use: i915

第一行包含供应商的nae、模型名称/系列和pci id。

VGA compatible controller [0300]: Intel Corporation 82G35 Express Integrated Graphics Controller [8086:2982]

注意括号内的数字- 8086:2982。这样的数字几乎出现在所有显卡上。第一部分(8086)表示供应商id(这里是Intel),第二部分(2982)表示pci id,它表示图形单元的模型。

 

现在,您可以使用供应商名称和pci id搜索谷歌以获得更多详细信息。

 

lshw命令还可以用来获取上述信息。

$ lshw -numeric -C display
WARNING: you should run this program as super-user.
  *-display:0             
       description: VGA compatible controller
       product: 82G35 Express Integrated Graphics Controller [8086:2982]
       vendor: Intel Corporation [8086]
       physical id: 2
       bus info: pci@0000:00:02.0
       version: 03
       width: 64 bits
       clock: 33MHz
       capabilities: vga_controller bus_master cap_list rom
       configuration: driver=i915 latency=0
       resources: irq:44 memory:e0200000-e02fffff memory:d0000000-dfffffff ioport:2440(size=8)

pci详细信息以相同的方式表示。活动设备驱动程序也列在“配置”行中。

 

下面是一个具有nvidia geforce 210显卡的系统的示例输出。

$ lspci -vnn | grep VGA -A 12
01:00.0 VGA compatible controller [0300]: NVIDIA Corporation GT218 [GeForce 210] [10de:0a65] (rev a2) (prog-if 00 [VGA controller])
.....

集成芯片组vs专用gpu

对于像nvidia或ati这样的专用设备,您可以很容易地在线搜索型号或pci id。规范和其他细节可以在供应商的网站上找到。

 

但是,对于像Intel GMA这样的集成图形芯片组,仅通过搜索系列名称(这里是82G35)或pci id可能无法获得足够的详细信息。

 

在这种情况下,查找主板模型并找到它的规范。厂商为他们生产的每一个主板模型发布产品规格文件。这些包含有关硬件的技术细节。

 

要找到您的主板模型,请使用dmidecode或inxi命令。

 

 

Dmidecode

$ sudo dmidecode -t baseboard | grep -i 'Product'
        Product Name: DG35EC

Inxi

$ inxi -M
Machine:   Mobo: Intel model: DG35EC version: AAE29266-210
           Bios: Intel version: ECG3510M.86A.0112.2009.0203.1136 date: 02/03/2009

以上输出显示其为“Intel DG35EC”主板。查找该模型的产品说明文档,并在其中查找视频/图形信息。

 

检查硬件加速

使用基于硬件的3d加速,需要绘制3d图形的应用程序可以直接使用硬件处理和生成图形,显著加快3d渲染。为此,显卡必须支持硬件加速,并且必须在系统上安装正确的驱动程序才能使用此功能。

 

硬件提供的3d处理功能符合OpenGL规范,有了合适的硬件,应用程序可以通过OpenGL api访问它们。OpenGL只定义了函数,而实现是在硬件内部完成的,这使得它非常快。

 

然而,也有像MESA这样的库完全在软件中实现opengl功能。因此,可以使用opengl渲染图形,而不需要一个与opengl兼容的gpu。因此,通过检查opengl呈现库,我们可以发现是否存在硬件加速。

 

检查glxinfo命令输出以获得OpenGL的详细信息

$ glxinfo | grep OpenGL
OpenGL vendor string: Intel Open Source Technology Center
OpenGL renderer string: Mesa DRI Intel(R) 965G 
OpenGL version string: 2.1 Mesa 10.1.0
OpenGL shading language version string: 1.20
OpenGL extensions:

“OpenGL渲染器字符串”指向MESA库,这意味着3d渲染完全在软件中处理。这将是一个缓慢的过程,游戏也不会运行得很好。

 

使用专用nvidia geforce 200显卡的机器上的输出看起来是这样的

$ glxinfo | grep OpenGL
OpenGL vendor string: NVIDIA Corporation
OpenGL renderer string: GeForce 210/PCIe/SSE2
OpenGL core profile version string: 3.3.0 NVIDIA 331.20
OpenGL core profile shading language version string: 3.30 NVIDIA via Cg compiler
OpenGL core profile context flags: (none)
OpenGL core profile profile mask: core profile
OpenGL core profile extensions:
OpenGL version string: 3.3.0 NVIDIA 331.20
OpenGL shading language version string: 3.30 NVIDIA via Cg compiler

Note the line

OpenGL renderer string: GeForce 210/PCIe/SSE2

So the OpenGL renderer is GeForce, which is the nvidia proprietory driver. This indicates the hardware based 3d acceleration is available. So graphics performance would be good.

linux下安装torch

阅读数 488

Linux实用命令

阅读数 29

Linux 4.7亮点特性

阅读数 960

没有更多推荐了,返回首页