diff --git a/Makefile b/Makefile index dabc76d..434b3ef 100644 --- a/Makefile +++ b/Makefile @@ -10,10 +10,10 @@ edit_render: blender/edit.blend imgs/buffer/scene_scene_0001.png imgs/buffer/sce python3 scripts/render.py --stage EDIT model_render: blender/models/curve-skeleton-cube.obj - docker run --rm -v ${PWD}/dump:/tmp -v ${PWD}/blender/:/blender/ -v ${PWD}/scripts:/scripts -v ${PWD}/config.yaml:/config.yaml -v ${PWD}/imgs/:/imgs tennisgazelle/blender-pipeline:latest --python scripts/model-render.py + docker run --rm -v ${PWD}/dump:/tmp -v ${PWD}/blender/:/blender/ -v ${PWD}/scripts:/scripts -v ${PWD}/config.yaml:/config.yaml -v ${PWD}/imgs/:/imgs tennisgazelle/blender-pipeline:latest --python scripts/model_render.py local_model_render: local_move_common_to_blender_py - /Applications/Blender.app/Contents/MacOS/Blender -b --python scripts/model-render.py + /Applications/Blender.app/Contents/MacOS/Blender -b --python scripts/model_render.py single_obj_render: blender/models/curve-skeleton-cube.obj docker run --rm -v ${PWD}/dump:/tmp -v ${PWD}/blender/:/blender/ -v ${PWD}/scripts:/scripts -v ${PWD}/config.yaml:/config.yaml -v ${PWD}/imgs/:/imgs tennisgazelle/blender-pipeline:latest --python scripts/obj-render.py -- --output_folder imgs/out/ blender/models/curve-skeleton-cube.obj @@ -21,8 +21,18 @@ single_obj_render: blender/models/curve-skeleton-cube.obj local_single_obj_render: local_move_common_to_blender_py /Applications/Blender.app/Contents/MacOS/Blender -b --python scripts/obj-render.py -- --output_folder imgs/out/ blender/models/curve-skeleton-cube.obj -docker: scripts/Dockerfile +docker: scripts/Dockerfile scripts/Dockerfile.gpu docker build -t tennisgazelle/blender-pipeline:latest scripts/ + docker build -t tennisgazelle/blender-pipeline-gpu:latest scripts/ -f scripts/Dockerfile.gpu + +local_enable_gpu: scripts/enable_gpu.py + /Applications/Blender.app/Contents/MacOS/Blender -b --python scripts/enable_gpy.py + +linux_local_enable_gpu: + /home/tennisgazelle/Downloads/blender-2.90.0-linux64/blender -b blender/cooler_scene.blend --python scripts/enable_gpu.py -f 1 -E CYCLES + +enable_gpu: + docker run --runtime=nvidia -e NVIDIA_VISIBLE_DEVICES=all --rm -v ${PWD}/imgs/:/imgs/ -v ${PWD}/blender/:/blender/ -v ${PWD}/scripts:/scripts -v ${PWD}/config.yaml:/config.yaml vogete/blender-cuda blender/cool_scene.blend --python scripts/force_gpu.py -f 1 get_paths: docker run --rm -v ${PWD}/blender/:/blender/ -v ${PWD}/scripts:/scripts -v ${PWD}/config.yaml:/config.yaml tennisgazelle/blender-pipeline:latest blender/cool_scene.blend --python scripts/get_path.py @@ -54,3 +64,5 @@ docker_build_test: echo 'if that works, try with the other blender files with yaml' docker run --rm -v ${PWD}/blender/:/blender/ -v ${PWD}/scripts:/scripts blender-pipeline:latest blender/scene.blend --python scripts/get_path.py +docker_check_gpu: + docker run --runtime=nvidia -e NVIDIA_VISIBLE_DEVICES=all --rm --entrypoint "" vogete/blender-cuda nvidia-smi diff --git a/config.yaml b/config.yaml index 7f9082b..a8550be 100644 --- a/config.yaml +++ b/config.yaml @@ -4,7 +4,7 @@ stages: file_output_format: '{bfile}_####' cool_scene: - buffer_frames: 1-90 + buffer_frames: 1 force_update: false render_output: 'imgs/buffer/' engine: CYCLES # todo: figure out how to do EEVEE @@ -13,7 +13,7 @@ stages: blender_flags: '' scene: - buffer_frames: 1-90 + buffer_frames: 1 force_update: false render_output: 'imgs/buffer/' engine: CYCLES # todo: figure out how to do EEVEE @@ -61,7 +61,11 @@ model_output_format: '{model}_{angle}_{map}' # experimental below, do not alter docker: - image: tennisgazelle/blender-pipeline:latest - render_cmd: docker run --rm -v {cwd}/blender/:/blender/ -v {cwd}/imgs:/imgs {image} blender/{blend_file} -E {engine} -F {format} -t 8 {flags} - # python_cmd: docker run --rm -v ${cwd}/blender/:/blender/ -v ${cwd}/scripts:/scripts -v ${cwd}/config.yaml:/config.yaml tennisgazelle/blender-pipeline:latest blender/scene.blend --python scripts/get_path.py + image: tennisgazelle/blender-pipeline-gpu:latest + # image: vogete/blender-cuda + # render_cmd: docker run --runtime=nvidia -e NVIDIA_VISIBLE_DEVICES=all --rm -v {cwd}/blender/:/blender/ -v {cwd}/imgs:/imgs {image} blender/{blend_file} -E {engine} -F {format} -t 8 -P scripts/force_gpu.py {flags} + render_cmd: docker run --runtime=nvidia -e NVIDIA_VISIBLE_DEVICES=all --rm -v {cwd}/blender/:/blender/ -v {cwd}/imgs:/imgs {image} blender/{blend_file} -E {engine} -F {format} -t 8 {flags} -P scripts/enable_gpu.py + # render_cmd: docker run --runtime=nvidia -e NVIDIA_VISIBLE_DEVICES=all --rm -v /scripts:/media -v {cwd}/blender/:/blender/ vogete/blender-cuda blender/cool_scene.blend -E CYCLES -t 0 -P scripts/force_gpu.py -o frame_### -f 1 + # python_cmd: docker run --rm -v ${cwd}/blender/:/blender/ -v ${cwd}/scripts:/scripts -v ${cwd}/config.yaml:/config.yaml tennisgazelle/blender-pipeline:latest blender/scene.blend --python scripts/get_path.py + use_gpu: True diff --git a/scripts/Dockerfile.gpu b/scripts/Dockerfile.gpu new file mode 100644 index 0000000..2618017 --- /dev/null +++ b/scripts/Dockerfile.gpu @@ -0,0 +1,45 @@ +# ARG IMAGE_NAME +# FROM ${IMAGE_NAME}:11.3.0-runtime-ubuntu20.04 +# LABEL maintainer "NVIDIA CORPORATION " +# ENV CUDNN_VERSION 8.2.0.53 +# LABEL com.nvidia.cudnn.version="${CUDNN_VERSION}" +# RUN apt-get update && apt-get install -y --no-install-recommends \ +# libcudnn8=$CUDNN_VERSION-1+cuda11.3 \ +# && apt-mark hold libcudnn8 && \ +# rm -rf /var/lib/apt/lists/* + +FROM nvidia/cuda:11.3.0-base-ubuntu20.04 + +LABEL authors="Daniel Lopez " + +# set up deps for blender +RUN apt-get update && \ + apt-get install -y \ + curl \ + libfreetype6 \ + libglu1-mesa \ + libxi6 \ + libxrender1 \ + xz-utils && \ + apt-get -y autoremove + +# Download blender +ENV BLENDER_MAJOR 2.82 +ENV BLENDER_VERSION 2.82a +ENV BLENDER_URL https://download.blender.org/release/Blender${BLENDER_MAJOR}/blender-${BLENDER_VERSION}-linux64.tar.xz + +RUN curl -L ${BLENDER_URL} | tar -xJ -C /usr/local/ \ + && mv /usr/local/blender-${BLENDER_VERSION}-linux64 /usr/local/blender + +# run the pip install for the bundled python +RUN curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py \ + && ls /usr/local/blender/${BLENDER_MAJOR}/python/lib \ + && /usr/local/blender/${BLENDER_MAJOR}/python/bin/python3.7m get-pip.py \ + && /usr/local/blender/${BLENDER_MAJOR}/python/bin/python3.7m -m pip install pyyaml yamale --user + +# Get the config common library near the blender executable +COPY common.py /usr/local/blender/${BLENDER_MAJOR}/python/lib/python3.7/ + +VOLUME /media +WORKDIR / +ENTRYPOINT ["/usr/local/blender/blender", "-b"] \ No newline at end of file diff --git a/scripts/config_schema.yaml b/scripts/config_schema.yaml index 6f76648..fc998b2 100644 --- a/scripts/config_schema.yaml +++ b/scripts/config_schema.yaml @@ -41,4 +41,5 @@ model_settings: docker_config: image: str() render_cmd: str() + use_gpu: bool(required=False, default=True) diff --git a/scripts/enable_gpu.py b/scripts/enable_gpu.py new file mode 100644 index 0000000..f01fd53 --- /dev/null +++ b/scripts/enable_gpu.py @@ -0,0 +1,21 @@ +# from model_render import Renderer + +import bpy +bpy.data.scenes[0].render.engine = "CYCLES" + +# Set the device_type +bpy.context.preferences.addons[ + "cycles" +].preferences.compute_device_type = "CUDA" # or "OPENCL" + +# Set the device and feature set +bpy.context.scene.cycles.device = "GPU" + +# get_devices() to let Blender detects GPU device +bpy.context.preferences.addons["cycles"].preferences.get_devices() +print(bpy.context.preferences.addons["cycles"].preferences.compute_device_type) +for d in bpy.context.preferences.addons["cycles"].preferences.devices: + d["use"] = 1 # Using all devices, include GPU and CPU + print(d["name"], d["use"]) + +bpy.ops.wm.save_mainfile() \ No newline at end of file diff --git a/scripts/force_gpu.py b/scripts/force_gpu.py new file mode 100644 index 0000000..39af4cc --- /dev/null +++ b/scripts/force_gpu.py @@ -0,0 +1,11 @@ +import bpy +for card in bpy.context.user_preferences.addons['cycles'].preferences.devices: + print(card.name) + +prefs = bpy.context.user_preferences.addons['cycles'].preferences +print(prefs.compute_device_type) +prefs.compute_device_type = 'CUDA' +prefs.devices[0].use = True + +bpy.ops.wm.save_userpref() +bpy.ops.wm.save_mainfile() \ No newline at end of file diff --git a/scripts/model-render.py b/scripts/model_render.py similarity index 100% rename from scripts/model-render.py rename to scripts/model_render.py diff --git a/scripts/setup-nvidia-toolkit.sh b/scripts/setup-nvidia-toolkit.sh new file mode 100755 index 0000000..68bb0de --- /dev/null +++ b/scripts/setup-nvidia-toolkit.sh @@ -0,0 +1,18 @@ +#!/bin/bash + +# distribution=$(. /etc/os-release;echo $ID$VERSION_ID) +distribution=ubuntu20.04 + +curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - \ + +curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list + +sudo apt-get update + +sudo apt-get install -y nvidia-docker2 + +sudo systemctl restart docker + + +cpu time: 39.811s +gpu time: 40.867 \ No newline at end of file