Assembler language is very specific to a particular CPU instruction set. It is not something that most people (even serious software engineers) need to concern themselves with, unless they are going to work on the lowest levels of an operating system kernel or operating system boot loaders. Then, it is a necessity. I have written my share of x86 assembler code for such reasons, but I have not had to do so for about 20 years now... :-)
So, if you want to port some low-level kernel code from x86 or ARM to a new XYZZY processor from Fubar, Ltd, then you may well need to learn assembler for the XYZZY processor.
Why would anyone put there self through this language
Because sometimes it's necessary when you want bare metal control, architecture-specific optimizations, or absolute performance. From my own experience, hardware drivers and the deepest bowels of compiler/library implementations tend to use at least a little bit of inline or straight assembly.
Sometimes you have no choice, as rubberman alluded to with boot loaders.
Knowing assembly is also useful in debugging programs; being able to walk through the generated code with a debugger is a underrated but important skill.
Compiler development also (usually) requires assembly language knowledge, for generating the target code.
Aside from this, understanding assembly language gives significant insights to the actual behavior of the computer system, especially how things like function calls actually work in the system.
That having been said, not many programmers today actually ever need to write assembly code. It is a valuable skill, but more for its side results, rather than for actual use as a programming language.
1) Sometimes, although rarely, one needs to program in assembly.
2) Helps to understand what kind of high level code is "light" for the used processor, or processors in general. (What kind of algorithms tend to be heavy.)
3) Optimization of high level code using machine dependent pragmas (sometimes).
4) Debugging a problem that SHOWS in a part of code you don't have sources of. That means that the bug might be in your code, but causes a library function to crash, and you need to know what it is in your code that the library function didn't digest.
5) Assembly is pretty logical. All kinds of bytecode interpreters are necessarily not.
6) Assembly is fun.
7) With assembly you can program many processing devices without expensive development environments. Just the assembler and PROMer. (couldn't come up with a good word that includes computers, processor boards, OBD-readers and other gadgets.)