Debian Lenny mit CUDA

Unter Linux hat man immer wieder das Problem, dass proprietäre Treiber nicht Bestandteil der jeweiligen Distribution sind und auch nicht über frei verfügbare Repositories nachinstalliert werden können. Um die CUDA-Fähigkeiten von nVidia-Grafikkarten und Lenny nutzen zu können, muss man allerdings nicht allzu viel tun.

Als erstes lädt man sich den CUDA-Treiber externerLink für Ubuntu 9.04 (am nähesten am aktuellen Debian, aktuellsten Link hinter dem wget einfügen) herunter und macht die Datei ausführbar. Falls auf dem Rechner mit der nVidia-GPU ein X-Server (die bunte Oberfläche) installiert ist und läuft, muss dieser X-Server beendet werden. Am einfachsten geht dies, wenn man sich abmeldet und anschließend von der Konsole aus den Dienst für den Anmeldebildschirm (gdm) beendet. Eben diese Konsole oder einen Zugang per ssh/putty benötigt man auch für alle weiteren Aktionen. Weiterhin werden die zum installierten Kernel gehörigen Sourcen und der dafür verwendete GCC benötigt. Der beim Kompilieren zu verwendende GCC muss über eine Umgebungsvariable definiert werden. Letzteren Befehl kann man sich sparen, wenn der GCC in dieser Version schon vorhanden und als Standardcompiler eingerichtet ist.

Im Folgenden die entsprechenden Konsolen-Befehle:

# wget http://developer.download.nvidia.com/compute/cuda/3_1/drivers
/devdriver_3.1_linux_64_256.40.run
# chmod 700 devdriver_*.run
# /etc/init.d/gdm stop
# apt-get install linux-source-2.6.26 gcc-4.1
# export CC=”gcc-4.1″

Wer nicht den Lenny-stable-Kernel verwendet, sollte entsprechend Kernelversion und GCC-Version anpassen. Die nötigen Versionsnummern erhält man mittels

# cat /proc/version

Nun fehlt nur noch das Ausführen der Treiberdatei:

# ./devdriver_*.run

Nach dem Start der Datei wird man dazu aufgefordert, die Lizenzvereinbarungen zu akzeptieren, was man natürlich auch tun sollte, damit anschließend automatisch der Treiber kompiliert und eingebunden wird. Im Testsystem kamen folgende Warnungen:
WARNING: You appear to be using a modular X.Org release, but the X library installation path, ‘X: warning; process set to priority -2 instead of requested priority 0
/usr/lib’, reported by `/usr/bin/X -showDefaultLibPath` does not exist. Please check your X.Org installation.
/usr/lib/xorg/modules’, reported by `/usr/bin/X -showDefaultModulePath` does not exist. Please check your X.Org installation.

WARNING: nvidia-installer was forced to guess the X library path ‘/usr/lib’ and X module path ‘/usr/lib/xorg/modules’; these paths were not queryable from the system. If X fails to find the
NVIDIA X driver module, please install the `pkg-config` utility and the X.Org SDK/development package for your distribution and reinstall the driver.

Danach folgt noch die Frage, ob die 32-Bit-Kompatibilitätsbibliotheken mitinstalliert werden sollen. Nachdem auch das erldeigt ist, bietet der Installer an, den nVidia-Treiber mittels des eigenen Tools nvidia-xconfig für den automatischen Start einzurichten.

Der Treiber läuft trotz der Warnungen bisher problemlos, wird auch von Boinc erkannt und lässt sich somit z.B. für GPU-Grid nutzen.

Das CUDA-Toolkit
Wer eigene GPU-Anwendungen schreiben möchte und die Developer Tools für CUDA sucht, kann diese von der selben Seite herunterladen, wo es auch die Treiber gibt. Nvidia bietet da eine ganze Menge an: CUDA Toolkit, GPU Computing SDK code samples, Visual Profiler, Open CL. Nach der Installation bekommt man noch einige Infos:

* Please make sure your PATH includes /usr/local/cuda/bin
* Please make sure your LD_LIBRARY_PATH
*   for 32-bit Linux distributions includes /usr/local/cuda/lib
*   for 64-bit Linux distributions includes /usr/local/cuda/lib64:/usr
/local/cuda/lib
* OR
*   for 32-bit Linux distributions add /usr/local/cuda/lib
*   for 64-bit Linux distributions add /usr/local/cuda/lib64 and /usr/local
/cuda/lib
* to /etc/ld.so.conf and run ldconfig as root
* Please read the release notes in /usr/local/cuda/doc/
* To uninstall CUDA, delete /usr/local/cuda
* Installation Complete

7 Reaktionen zu “Debian Lenny mit CUDA”

  1. admin

    So man CUDA für Boinc verwenden möchte, muss man dafür sorgen, dass der nVidia-Treiber vor dem Start von boinc-client geladen wird. Da dies standardmäßig über den gdm geschieht und dieser im Normalfall als Start-/Stop-Wert S30/K01 nutzt (siehe ls -l /etc/rc3.d/ bzw. rc0.d), der Boinc-Client hingegen aber mit S30/K30 eingerichtet wird, muss mit folgenden Befehlen nachgebessert werden:

    # update-rc.d -f boinc-client remove
    # update-rc.d boinc-client defaults 35 25

    Statt dem boinc-K25 könnte wegen gdm-K01 auch ein kleinerer Wert genommen werden, Hauptsache dieser ist größer als 1.

  2. admin

    Seit Juni 2010 gibt es die Version 3.1.1 des Toolkits, ich habe den wget oben entsprechend angepasst.

    Da kürzlich die nächste Debian-Version (Squeeze) auf den Status frozen gesetzt wurde und somit der ein oder andere vermutlich Debian-Neuinstallationen bereits mit dem zukünftigen Stable-Release durchführen mag, müssen natürlich dann entsprechend die Kernelsourcen angepasst werden. Debian Squeeze hat als Standard-Kernel 2.6.32 und GCC 4.3.2 an Bord. Der aktuelle Kernel wurde bei mir mit dem 4.3.5 kompiliert, was aber nicht stört. Allerdings fehlten mir dieses mal trotz vorhandenen Kernel-Sourcen die Header-Pakete (Fehlermeldung: ERROR: Unable to find the kernel source tree for the currently running kernel. Please make sure you have installed the kernel source files for your kernel and that they are properly configured; on Red Hat Linux systems, for example, be sure you have the ‘kernel-source’ or ‘kernel-devel’ RPM installed. If you know the correct kernel source files are installed, you may specify the kernel source path with the ‘–kernel-source-path’ command line option.). Vermutlich haut dort eine Abhängigkeit noch nicht hin.
    Diese installiert man z.B. wie folgt nach:

    # apt-get install linux-headers-2.6.32-5
    

    Edit: nach dem Dist-Upgrade wollte der CUDA-Treiber sich auch mit den eben ergänzten Tipps nicht kompilieren lassen und auch an den üblichen rivafb-Treibern lag es nicht. Stattdessen war beim Dist-Upgrade der Grafiktreiber nouveau aktiviert worden, den ich per modprobe nicht entfernt bekam. Außerdem ist der gdm durch den gdm3 ersetzt worden, wobei einige überflüssige (und verwirrende) Dateien übrig blieben. Also sind folgende zusätzlichen Befehle hilfreich:

    # update-rc.d -f gdm remove
    # rm /etc/init.d/gdm
    # /etc/init.d/gdm3 stop
    # mv /lib/modules/2.6.32-5-amd64/kernel/drivers/gpu/drm/nouveau/nouveau.ko
    /lib/modules/2.6.32-5-amd64/kernel/drivers/gpu/drm/nouveau/nouveau.ko.old
    # export CC=”gcc-4.3″
    # ./devdriver_3.1_linux_64_256.40.run
    
  3. admin

    Sobald man die abhängigkeitsbasierte Startreihenfolge (z.B. ab Debian Squeeze, alias Lenny-testing; aktuelle Ubuntu-Varianten) in seinem System aktiv hat, kann nicht mehr die obige Variante der Umstellung des Update-Scripts für Boinc genutzt werden. In dem Fall muss der gdm im Init-Script ergänzt werden. Die entsprechenden Zeilen in der Datei /etc/init.d/boinc-client sehen dann wie folgt aus:

    # Required-Start:    $local_fs $remote_fs gdm3
    # Required-Stop:     $local_fs $remote_fs gdm3

    Anschließend muss noch ein

    # update-rc.d boinc-client defaults

    ausgeführt werden und damit ist der fürs GPU-Crunching erforderliche CUDA-Treiber beim Start des Boinc-Clients geladen.

  4. admin

    Mal wieder was neues als Fehlermeldung:
    ERROR: An NVIDIA kernel module ‘nvidia’ appears to already be loaded in your kernel. This may be because it is in use (for example, by the X server), but may also happen if your kernel was configured without support for module
    unloading. Please be sure you have exited X before attempting to upgrade your driver. If you have exited X, know that your kernel supports module unloading, and still receive this message, then an error may have occured that
    has corrupted the NVIDIA kernel module’s usage count; the simplest remedy is to reboot your computer.

    ERROR: Installation has failed. Please see the file ‘/var/log/nvidia-installer.log’ for details. You may find suggestions on fixing installation problems in the README available on the Linux driver download page at nvidia.com.

    Also X ist aus, der Kernel unterstützt unter Garantie das Module-Unloading - probiere ich doch mal den Neustart. Das “Boot tut gut” haben die sich wohl bei dem Fensterbetriebssystem abgeguckt.

    So, Rechner ist wieder oben und ich bin etwas verwirrt. Der X kommt hoch, der NVIDIA-Treiber läuft ohne Neukompilierung und das obwohl ich den Kernel aktualisiert hatte. OK, beim nächsten Mal probiere ich es gleich, ob der Boot hilft … Jedenfalls ist diese Maschine jetzt wieder auf dem Stand der Debian-Zeit: Squeeze ist seit kurzem stable, zuvor lief auf dem Rechner Squeeze noch als testing und die letzte Aktualiserung war vor der Einführung des “Sternchen-Desktops”. Merkwürdiger Weise wird der dort angeschlossene uralte LCD-Bildschirm allerdings nicht mehr erkannt, da muss wohl was flöten gegangen sein. Bisher lief die Auflösung mit 1024×768 problemlos, jetzt habe ich nur noch 640×480. Den Grund dafür suche ich aber ein ander Mal.

  5. Martin

    Warum bekomme ich es einfach nicht hin? Trotz mehrmaliger Versuche will es mir nicht gelingen, daß Boinc mit CUDA läuft. Also CUDA läuft, Boinc läuft, aber die GPU wird nicht genutzt. Mit Ubuntu funktioniert es zwar, aber Ubuntu gefällt mir aus anderen Gründen nicht.

    Habe einen AMD64 Prozessor mit Debian-64bit, der zur Zeit mit ’sid’ läuft, hatte aber auch squeeze versucht, allerdings auch nicht erfolgreich. Wenn Sie eine Idee hätten, oder besser noch eine Anleitung für Dummies, dann wäre ich Ihnen sehr dankbar. Das Problem beschäftigt mich nun schon einige Monate.

    Vielleicht würde es reichen, wenn ich Ubuntu installiere, mir die entsprechenden Dateien sichere und dann wieder Debian installiere und diese dann übertrage. Aber dazu müßte ich wissen, welche Dateien da wichtig sind für mich.

    Zu Ihrem Problem mit der Monitor-Auflösung habe ich eine Lösung, wenn auch sicher nicht die eleganteste. Einfach die ‘/etc/X11/xorg.conf’ erweitern wie folgt:

    Section “Monitor” Identifier “Monitor 0″
    ModelName “Default Monitor”
    HorizSync 31.5-81.1
    VertRefresh 56-75
    .
    .
    .

    Section “Screen”
    Identifier “Screen 0″
    Monitor “Monitor 0″
    DefaultColorDepth 16
    SubSection “Display”
    Depth 16
    Modes “1600×1200″ “1280×1024″ “1280×960″ “1024×768″ “800×600″

    Diese Einstellungen sind natürlich nur für meinen Monitor, aber einfach die Daten von Ihrem Monitor übernehmen und schon funktioniert es wie früher auch.

    Würde mich außerordentlich freuen, wenn sie mir behilflich sein könnten.

  6. admin

    Die Frage an der Stelle ist, ob überhaupt das richtige Modul vom Kernel geladen wurde. Ich versuche mal einige Anhaltspunkte dafür zusammenzutragen.

    Der Befehl lsmod gibt bei mir u.A. Folgendes zurück:
    nvidia 10865636 40
    i2c_core 15712 5 nvidia,drm_kms_helper,drm,i2c_algo_bit,i2c_nforce2

    Mit lspci erhalte ich ganz unten in der Liste:
    02:00.0 VGA compatible controller: nVidia Corporation C77 [GeForce 8300] (rev a2)

    Beim dmesg sehe ich z.B. folgende Zeilen:
    [ 0.373365] pci 0000:02:00.0: reg 10 32bit mmio: [0xfd000000-0xfdffffff]
    [ 0.373370] pci 0000:02:00.0: reg 14 64bit mmio pref: [0xf0000000-0xf7ffffff]
    [ 0.373374] pci 0000:02:00.0: reg 1c 64bit mmio pref: [0xfa000000-0xfbffffff]
    [ 0.373377] pci 0000:02:00.0: reg 24 io port: [0xec00-0xec7f]
    [ 0.373380] pci 0000:02:00.0: reg 30 32bit mmio pref: [0xfeae0000-0xfeafffff]
    [ 0.394545] vgaarb: device added: PCI:0000:02:00.0,decodes=io+mem,owns=io+mem,locks=none
    [ 0.480943] pci 0000:02:00.0: Boot video device
    [ 6.504838] nvidia 0000:02:00.0: PCI INT A -> Link[SGRU] -> GSI 21 (level, low) -> IRQ 21
    [ 6.504845] nvidia 0000:02:00.0: setting latency timer to 64
    [ 6.504848] vgaarb: device changed decodes: PCI:0000:02:00.0,olddecodes=io+mem,decodes=none:owns=io+mem

    Wie weiter oben beschrieben ist es wichtig, dass die Datei /lib/modules/2.6.32-5-amd64/kernel/drivers/gpu/drm/nouveau/nouveau.ko umbenannt, verschoben oder schlicht gelöscht wird.

    Ob das richtige Modul geladen wurde, kannst Du auch innerhalb von X überprüfen. Im Gnome habe ich unter System -> Einstellungen einen Menüpunkt NVIDIA X Server Settings und das Tool zeigt mir eine NVIDIA Driver Version 256.40 an. Wenn sollte die Nummer durch Aktualisierungen eher höher sein. Übrigens recht genial das Tool, hatte ich mir bisher noch nie angeschaut. Das zeigt z.B. Temperatur, Takt usw. an. Theoretisch kann man damit scheinbar auch die Auflösungen ändern.

    So und als letzten Schritt solltest Du außerdem gucken, was Dir der BoincMgr beim Start zur GPU sagt. Wenn das richtige Modul aktiv ist und vor(!) Boinc gestartet wurde, dann muss da etwas ähnliches wie
    31.03.2011 19:46:43 NVIDIA GPU 0: GeForce 8300 (driver version unknown, CUDA version 3010, compute capability 1.1, 509MB, 24 GFLOPS peak)
    stehen.

    Danke noch für den xorg.conf - Eintrag, habe das immer noch nicht geändert, weil das halt nur mein Zweitrechner ist und ich den in der Regel nur Remote nutze :)

    Viel Erfolg!

  7. admin

    Die obige Anleitung mit den Tipps und Anpassungen drum herum lässt sich natürlich auch für das aktuelle Debian Squeeze 6.0 anwenden. Da nicht nur Debian Squeeze die frischere Variante ist, sollte man natürlich auch einen aktuellen Treiber verwenden. Die neueste CUDA-Treiberversion ist 4.0 RC, stable ist derzeit noch die 3.2. Hier der Link zur Version 4.0: CUDA-Treiber externerLink

    Das Beste an dem neuen Treiber ist, dass auch endlich vorhandene Treiber zuverlässig erkannt und beseitigt werden. Einerseits wird der alte Treiber entfernt (das ging auch schon zuvor) und nunmehr wird eine Option angeboten, um das Standard-Modul nouveau zu deaktivieren. Falls dieses geladen ist, erscheint folgende Meldung:
    For some distributions, Nouveau can be disabled by adding a file in the modprobe configuration directory. Would you like nvidia-installer to attempt to create this modprobe file for you?
    Dies sollte man dann bestätigen. Danach gibt es noch eine abschließende Info:
    The modprobe configuration file to disable Nouveau, /etc/modprobe.d/nvidia-installer-disable-nouveau.conf, has been written. For some distributions, this may be sufficient to disable Nouveau; other distributions may require modification of the initial ramdisk. Please reboot your system and attempt NVIDIA driver installation again. Note if you later wish to reenable Nouveau, you will need to delete the file /etc/modprobe.d/nvidia-installer-disable-nouveau.conf.

    Das Leben könnte also ganz einfach sein, wenn nicht zum Schluß die geliebte Meldung ERROR: Installation has failed. Please see the file ‘/var/log/nvidia-installer.log’ for details. You may find suggestions on fixing installation problems in the README available on the Linux driver download page at www.nvidia.com. kommen würde.

    Nach einem anschließenden Reboot wird zwar der nvidia-Treiber geladen, allerdings bei mir der noch vorhandene alte 3.1er Treiber. Der Versuch, nach dem Beenden des gdm3 den 4.0er Treiber erneut zu installieren bekam ich dann folgende Fehlermeldung:
    ERROR: An NVIDIA kernel module ‘nvidia’ appears to already be loaded in your kernel. This may be because it is in use (for example, by the X server), but may also happen if your kernel was configured without support for module unloading. Please be sure you have exited X before attempting to upgrade your driver. If you have exited X, know that your kernel supports module unloading, and still receive this message, then an error may have occured that has corrupted the NVIDIA kernel module’s usage count; the simplest remedy is to reboot your computer.

    Na ganz toll, ist also ein ähnlicher Effekt wie am 04.03. gepostet: X ist beendet, Modul-Unloading wird unterstützt und neu gestartet hatte ich auch schon. Selbstverständlich gibt das Logfile keine zusätzlichen Infos und ein rmmod nvidia (das bewußte zu ersetzende Modul) führt zu einem Konselen-Freeze … OK, dann warte ich eben auf die stable 4.0 und hoffe, dass es dann klappt.

Einen Kommentar schreiben